• 締切済み

ダブルバッファ法を教えて下さい

通信系のプログラムを作っているのですが、まったく分からなくて困っています。二つのメモリを確保し、まずバッファAが受信します。バッファAがいっぱいになるとバッファAはHDDに書き込みその間にバッファBで受信を行います。バッファBがいっぱいになるとHDDに書き込み、その間にバッファAが受信する・・・という風なサイクルでプログラムを動かしたいのですが、よろしくお願いします。C・C++で書かれたソースプログラムを下さい。

みんなの回答

回答No.1

要はHDDへの書き込みとデータの受信を並行して行ないたいのですよね。 マルチスレッドもしくは非同期IOで実装することになろうかと思います。 > C・C++で書かれたソースプログラムを下さい。 ここはあなたの代わりにコードを書いてくれるところではありません。

loversouler
質問者

お礼

アドバイスありがとうございます。 マルチスレッドについて詳しく書いてあるHPなどがあれば教えて下さい。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • パイプのバッファ開放のタイミング(Linux C言語)

    パイプのバッファ開放のタイミング(Linux C言語) パイプを使って同一プロセス上でスレッド間の通信を行おうと思っています。pipe()でファイルディスクリプタを用意して、2つのスレッドで使用します。このとき、メモリ上にバッファが確保されると思うのですが、このpipeのバッファが開放されるタイミングはいつでしょうか? //2つのファイルディスクリプタがcloseされた時? 組み込み機器の一つのプロセス上で何度もpipeを使うので、メモリの開放のタイミングが気になっています。 ご存知でしたらご教示ください。よろしくお願い致します。

  • バッファオーバーフローで疑問があります。

    スタックのバッファオーバーフローで、バッファオーバーフローを起こすことで、変数領域の内容が上書きされ、さらにスタックのその他の領域(サブルーチンの戻りアドレスなど)までも書き換わってしまうとありますが、なぜそんなことが起きるのでしょうか? 私のイメージ的に、スタックの内容が以下のようだとして、 |          | | 変数領域(B) | |------------| | 変数領域(A) | |------------| | SFP       | |------------| | 戻りアドレス | |------------| | 関数の引数  | |------------| バッファオーバーフローが起きたとしても上書きされるのは 変数領域A,Bだと思ったのですが、スタックには最大領域でも決まっていてそれおも超えるデータ量の場合は、領域いっぱいまですべて上書くようにでもなっているのでしょうか? 気になって仕方がありません。 どうかよろしくお願いいたします。

  • VC++ 6.0 のソケット通信について

    VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。

  • Direct3Dでの最大バッファサイズ

    こんにちは。 DirectX9.0cを使ったプログラムを書いています。 IDirect3D9::CreateDeviceを使ってデバイスを作成する際、D3DPRESENT_PARAMETERS::BackBufferWidth、D3DPRESENT_PARAMETERS::BackBufferHeightを使ってバックバッファのサイズを指定することができますが、このパラメータに設定できる最大値を予め取得する方法はあるのでしょうか。 現在、Windowモードでプログラムしているのですが、ウィンドウのサイズ変更のたびにIDirect3DDevice9::Resetをするのではなく、最初から画面サイズのバックバッファを確保しています。 ほとんどのPCはこのやりかたで動いていたのですが、一部PCで CreateDeviceに失敗することがあり、最大では確保できないようなのです。 UIを少々変更して、多少小さいバックバッファでもそれなりに見せることは可能なのですが、その際にいちいちCreateDeviceで試してみるのでは、効率が悪すぎます。 そんなわけで、CreateDeviceできる最大サイズを取得したいのですが、なにか方法はありますでしょうか?

  • URLクラスでのリード時のバッファサイズについて

     URLクラスでインターネットアクセスするときに、以下のようにプログラムする場合、望ましいBUFSIZEはあるのでしょうか。  inputstream.read(byte_buf,offset,BUFSIZE) A  プログラマーは任意のバッファサイズを指定して、なんら問題はない。  仮に1であっても、実際はJavaのほうでネットアクセスするに最適なサイズでアクセスし、そこから1バイトずつくれるので問題はない。同様にして、メモリの許す限りに大きいバッファサイズも問題はない。 B  Javaはコーディングどおりに、サーバーに1バイトを要求するので、ファイルダウンロードする方法としてとんでもないことだ。同様にして、一度に何十メガバイトもの指定もとんでもないことだ。    AとBで、どちらが正しいでしょうか。Bならば、のぞましいバッファサイズと、その根拠を教えてください。通常、ダウンロードするときのネットマナーみたいなものはあるのでしょうか。

    • ベストアンサー
    • Java
  • バッファリング処理を高速化したいです。

    バッファリング処理を高速化したいです。 perlのプログラムで性能がでなくて困っています。 ファイルの中身からレコードヘッダを検索しつつ可変長なレコードの件数をカウントするツールで バッファリングというかストリーミングっぽい処理をしているのですが 思いの外、性能が出ずこまっています。 (600MBのテキストで10分弱くらい、予定では1分程度で終わる見込みでした) とりあえず、非効率そうなのは、1レコード取得する部分と下記のようなバッファシフトの部分くらいなのですが バッファシフトについて何かもっとよい書き方はありますでしょうか? 処理的なイメージはこんな感じになっています。 LOOP_A: read(IN, $readbuf, 10240); $buf .= $readbuf; LOOP_B: ... レコード長の計算 ... バッファ内にレコード長以上なければ、LOOP_Aへ $buf = substr($buf,$reclen); # 処理済みレコードの削除 LOOP_B へ substr()の部分を C的にいうと先頭アドレスだけ移動するような書き方ができれば一番なのですが~ 1レコード取得は正規表現で探しているのですがこちらはもうすこし調べてからにしようと思います。

    • ベストアンサー
    • Perl
  • TCPの通信において、受信バッファから上位アプリケーションへデータを渡

    TCPの通信において、受信バッファから上位アプリケーションへデータを渡すタイミングについて教えてください。 PSHフラグが立っているデータを受信すると上位アプリケーションへ渡すというのは学びましたが、その他どのようなタイミングで上位アプリケーションへデータを渡すのかわからなかったため質問させていただきました。 例えば、PSHフラグのデータが来る前に受信バッファがいっぱいになってしまったら、受信側で勝手にデータを渡してしまうのでしょうか。(それともバッファがいっぱいになると送信側がPSHフラグを送ってくれるのでしょうか。でもゼロウィンドウプローブを考えるとそれもない気がします。) また、TCPでの通信部分なため、このあたりの動作に関してはアプリケーションごとではなくOSに依存するのかなと思っており、アプリケーションとしてはどのような塊(タイミング)でデータを受信してもちゃんと処理できるのかなというのも気になります。 「現在はPSHフラグを無視している」というのもネット上で見かけましたが、そうするとますますOSの独断でデータをアプリケーションに渡しているのかなと思いました。 このあたりがよくわからなかったので、ご教授願えればと思います。 ※スライディングウィンドウ、ゼロウィンドウについてはネットですぐ見つかる程度の範囲では理解しているつもりです。

  • AF_UNIXのsocketと共有メモリを使ったリングバッファーの速度比較

    いま、仕事でlinux上で2つのプロセスを動かし、プロセスの間で、高速で大量のデータの受け渡しが必要なプログラムを作っています。プロセス間の通信は普通の socket で AF_UNIX を使っています。  できるだけ速度を上げたいのですが、AF_UNIXのsocketのかわりに共有メモリを使ってリングバッファーでキューを作ってデータを送るという案が出ました。この方法によって速度の向上は期待できるでしょうか?

  • Linuxでパケットのデータ部分を合成するプログラムを教えてください。

    LinuxでC言語を使用しているのですが、パケットのデータ部分を合成するプログラムのを教えてください。 具体的な例として、 端末A,B,Cがあり、AはBを中継して、CにUDPパケットを2個送信します。 中継端末のBは2個のUDPパケットをバッファリングした後、データ部分のみを1個のパケットにまとめてCに送信します。(ヘッダ部分はAが送信したときと同じにしたい) Cは2個分のデータが入ったUDPパケットを1個受信する。 この例の端末Bでのプログラムを書くとするとどのようにすればいいのでしょうか?? よろしくお願いしますm(_ _)m

  • SerialPortのDataReceivedイベントについて

    Visial Basic 2005 にて SerialPort コンポーネントを使ったアプリを作っています。 当初、Microsoft のサンプルを参考に SerialPort1.ReadLine でデータを受信していたのですが、この方法だとバッファ内から再度同じデータを受信してしまうらしく、新しいバッファからデータを受信しないとイベントが発生する毎に古いデータを読み取ってしまいます。 そこで調べていたところ、Microsoft のフォーラムで以下のような Visual C# のソースを見つけました。 (以下引用) > if (serialPort1.BytesToRead > 0) > { > // 受信バッファからデータを取得 > byte[] b = new byte[serialPort1.BytesToRead]; > Read(b, 0, b.Length); > } まだ Visial Basic 初心者なもので Byte 型の扱い方や上記ソースは Visial Basic でどのように書けばよいのかわかりません。 どなたかご教授ください。 よろしくお願いいたします。