1

クライアントのリクエストを解釈し、適切なハンドラーをディスパッチするメインループを持つ単一クライアントの(今のところ)サーバーを作成しています。

いくつかのタスクでは、MS オーバーラップ I/O を使用したいと思います (これは Windows 専用です)。そのうちの 1 つで、ファイルから読み取り、コンテンツをソケットに書き込みたいと考えています。私はそのアクションのためにクラスラップを持っているので、それはバッファ、ファイルのサイズを割り当て、次にReadFileへの呼び出し(実際のファイルシステムファイルを使用)が行われ、その後にWriteFileが続きます(今回はソケットハンドルへ) )両方が重なって作られています。

問題は: 非同期であるため、クラス d'tor が自動的に呼び出され、ジョブが完了する前にファイルのバッファーが解放されます。

明らかに、それは私の壊れたデザインです。あなたの提案を聞きたいです。

ありがとう!

4

4 に答える 4

1

GetOverlappedResultドキュメントを見ると設定された状態で呼び出したいようですbWait。重複した操作が完了するまでブロックされます。

于 2012-10-03T22:03:33.043 に答える
0

皆さんありがとう、

チェックのために別のスレッドを使用したり、完了を待ったりすると、非同期IOの利点が失われるように見えるため、何かが欠けているようです。

私が探しているのは、MS が開発者を使用するように計画した使用方法だと思います。

于 2012-10-04T09:44:04.483 に答える
0

非同期関数内およびデストラクタ内でミューテックスを使用できます。

于 2012-10-03T22:04:47.037 に答える
0

バックグラウンドで動作するスレッドを作成して、ファイル IO がまだ実行される必要があり、ファイルのクラスを開いたままにしておく必要があることを確認できます (待機を続けるための単なるループであっても)。そうすれば、ソケットは必要なことを実行でき、IO は継続的に (クラスのメンバー変数に設定したフラグを介して) ステータスを通知し続けることができます。

次に、デストラクタで、ロックが解除されて準備ができているかどうかを確認します。それ以外の場合は、別の失速ループです。

于 2012-10-03T23:24:18.153 に答える