2

送信される新しいメッセージと、ネットワーク上の新しいデータの受信の両方に応答できるクライアント ネットワーク スレッドが必要です。このスレッドがポーリング ループを実行するのを避けたいのですが、必要な場合にのみ処理したいと考えています。

シナリオは次のとおりです。

クライアント アプリケーションは、完全ではないが大部分が同期しているプロトコルを介してサーバーと通信する必要があります。通常、クライアントはサーバーにメッセージを送信し、応答が受信されるまでブロックします。

サーバーはクライアント要求を非同期的に処理する場合があります。この場合、クライアントへの応答は結果ではなく、処理が開始されたという通知です。結果メッセージは、サーバーがクライアント要求の処理を完了すると、将来のある時点でクライアントに送信されます。

非同期結果通知は、いつでもクライアントに到着できます。これらの通知は、受信時に処理する必要があります。つまり、クライアントが再度送信したときにのみバックログを処理することはできません。

クライアントのネットワーク スレッドは、サーバーからの通知を受信して​​処理し、クライアントからの発信メッセージを送信します。

これを実現するには、ネットワーク データが受信されたとき、または送信するメッセージが入力キューに入れられたときに、処理を実行するためにスレッドをウェイクさせる必要があります。

キューに入れられた作業項目またはソケットからのデータの処理を実行するために、スレッドをウェイクアップするにはどうすればよいですか?

私は主にプレーンな Win32 API を使用することに興味があります。

最小限の例または関連するチュートリアルは大歓迎です!

4

4 に答える 4

2

ハンドルのI/O完了ポートを設定し、スレッドを完了ポートで待機させることができます。

実際には、ポートで複数のスレッドを待機させることができます(通常、プロセッサごとに1つのスレッドが適切に機能します)。

于 2009-08-05T18:43:35.117 に答える
2

Michael の提案に続いて、IO Completion Port スタイルのソケットのフレームワークを提供する無料のコードがいくつかあります。また、IOCP ベースの作業キューも含まれています。hereから問題を解決するために、そこからいくつかのものを取得できるはずです。

于 2009-08-05T21:30:04.093 に答える
0

両方のオブジェクトに標準のWindowsハンドルがある場合は、クライアントにWaitForMultipleObjectsを呼び出してそれらを待機させることができます。

ネットワークポートのサービスを独自のスレッドに分割することを検討することをお勧めします。それは物事を大幅に単純化するかもしれません。ただし、その新しいスレッドとメインスレッドの間で他の何かを同期する必要があるだけの場合は役に立ちません。

于 2009-08-05T19:17:33.673 に答える