1

私はすでにwininetを使用していくつかの同期HTTPリクエストを送信しました。ここで、さらに一歩進んで、非同期でコンテンツを要求したいと思います。

目標は、「リバースプロキシ」のようなものを取得することです。誰かが私に連絡したいと思ったらすぐに、応答が遅れるHTTPリクエストを送信します。その間何もなかったかのように私のスレッドは続行する必要があり、応答が到着するとすぐにこのスレッドでコールバックが呼び出される必要があります。応答を処理する2番目のスレッドは必要ないことに注意してください(必要な場合は、メインスレッドを中断してそこでコールバックを呼び出すメカニズムのみを提供する必要があります)。

更新:たぶん、私が欲しいものを説明する最良の方法は、スレッドが1つしかないが、AJAXリクエストを送信できるJavaScriptのような動作であり、その結果、このメインスレッドでコールバックが呼び出されます。

それがどのように機能するかを理解したいので、ライブラリソリューションは必要ありません。誰かが私の望む行動を達成する方法を説明するいくつかの良いチュートリアルを知っていますか?

4

2 に答える 2

1

メインスレッドがメッセージキューのようなものをリッスンしていない限り、それを乗っ取って、現在実行している以外のコードの実行を開始する方法は実際にはありません。

boost :: asioがどのように機能するかを見てみましょう。基本的に、接続、読み取り、書き込みなどを非同期で実行できます。たとえば、プライマリ(または任意の)スレッドで非同期読み取りを開始すると、asioはオーバーラップしたIOを使用して質問します。 OSがIOの完了を通知します。非同期読み取りが完了すると、コールバックはワーカースレッドの1つによって実行されます。

あなたがする必要があるのは、IO完了キューを処理するためにメインスレッドまたはワーカースレッドのいずれかでio_service :: run()を必ず呼び出すことです。runで呼び出すスレッドはすべて、コールバックを実行するスレッドになります。

Asioには、ルールに従えば、このマルチスレッドの方法をかなり堅牢にするいくつかの保証があります。

asioを使用する予定がない場合でも、asioのドキュメントを参照してください。これが自分で取り組みたい場合は、多くのパターンやアイデアが非常に興味深いものになります。

見たくない場合は、Windowsでは非同期IOを実行する方法は「オーバーラップIO」と呼ばれることを覚えておいてください。

于 2009-12-30T07:02:36.143 に答える
1

その間何もなかったかのように私のスレッドは続行する必要があり、応答が到着するとすぐにこのスレッドでコールバックが呼び出される必要があります。

ここで求めているのは、基本的に(GO TOではなく)COMEFROMですこれは、実際には存在しない神話上の指示です。コードを呼び出す唯一の方法は、発行スレッドでポーリングするか、同期IOを実行し、結果を使用してコールバック(そのスレッドまたはさらに別の生成されたスレッド)を実行する別のスレッドを作成することです。 。

ソケットを使用してC++で作業していたとき、開いているすべてのソケットを反復処理し、ブロックせずに利用できるデータをポーリングし、データを取得してバッファーに詰め込み、バッファーをコールバックに送信する専用スレッドを設定しました。与えられた状況(EOL、EOF、そのようなもの)。

于 2009-12-30T01:40:16.320 に答える