アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。

クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。
thread_start→マルチスレッド作成→
CSocket::Sendでサーバへメッセージ送信→
CSocket::OnReceiveでサーバのメッセージ受信→
サーバメッセージから処理実行と言った流れです。

通常の処理は、この流れで問題ないのですが、
ある処理の場合、thread_startをforループで数回繰り返す
処理を行っています。
この時、データにタイムラグが出てしまうため、
thread_startから処理実行までの一連の流れが終了するまで、
次のthread_startは呼ばれずに待機させたいのですが、
どのようにすれば良いのかが分かりません。

Sendを呼んだタイミングで、
WaitForSingleObjectでスレッドのハンドルを渡したり、
CreateEventでイベントハンドルを渡したりしてみたのですが、
WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で
止まってしまうため、そのままフリーズ状態になってしまいます。

どのタイミングでWaitFor~を呼ぶべきなのか、
もしくは、何か別の手段があるのでしょうか?

A 回答 (1件)

Event を set する関数が、待っている関数の下で呼び出されていませんか?


たまに、関数の上下関係が原因で、WaitForSinlgObjectが無限に待ってることがあります。
テストで、階層の高い位置でSetEventしてみて、フリーズ解除できるかどうか確認してみてください。

もし、動作するようならば、構造を変える必要があります。
どんな構造でどうやってるのかすら、想像できませんけど。

この回答への補足

CreateEventはthread_startを呼ぶ関数にて。
WaitForSingleObjectは、Sendを呼んだ後で。
SetEventはOnReceiveの最後に呼んでいますので、
合っていると思われます。

構造を変えるというのは、
通信手法を変えるということでしょうか?

補足日時:2009/06/02 12:08
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/02 19:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!