• 締切済み

CSocket通信での待機処理について

VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。 クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。 thread_start→マルチスレッド作成→ CSocket::Sendでサーバへメッセージ送信→ CSocket::OnReceiveでサーバのメッセージ受信→ サーバメッセージから処理実行と言った流れです。 通常の処理は、この流れで問題ないのですが、 ある処理の場合、thread_startをforループで数回繰り返す 処理を行っています。 この時、データにタイムラグが出てしまうため、 thread_startから処理実行までの一連の流れが終了するまで、 次のthread_startは呼ばれずに待機させたいのですが、 どのようにすれば良いのかが分かりません。 Sendを呼んだタイミングで、 WaitForSingleObjectでスレッドのハンドルを渡したり、 CreateEventでイベントハンドルを渡したりしてみたのですが、 WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で 止まってしまうため、そのままフリーズ状態になってしまいます。 どのタイミングでWaitFor~を呼ぶべきなのか、 もしくは、何か別の手段があるのでしょうか?

みんなの回答

  • wathavy
  • ベストアンサー率22% (505/2263)
回答No.1

Event を set する関数が、待っている関数の下で呼び出されていませんか? たまに、関数の上下関係が原因で、WaitForSinlgObjectが無限に待ってることがあります。 テストで、階層の高い位置でSetEventしてみて、フリーズ解除できるかどうか確認してみてください。 もし、動作するようならば、構造を変える必要があります。 どんな構造でどうやってるのかすら、想像できませんけど。

lhouse
質問者

お礼

Sendした後は、サーバがメッセージを送信すると、 自動でOnReceiveに入ってくるので、 特に何の処理も入れてなかったのですが、 Send後に、selectで受信可能になるまで待機させ、 可能になったらOnReceiveを呼ぶようにすることで、 SendからReceiveまでを一つの継続した流れで処理することで 解決しました。

lhouse
質問者

補足

CreateEventはthread_startを呼ぶ関数にて。 WaitForSingleObjectは、Sendを呼んだ後で。 SetEventはOnReceiveの最後に呼んでいますので、 合っていると思われます。 構造を変えるというのは、 通信手法を変えるということでしょうか?