VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。
クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。
thread_start→マルチスレッド作成→
CSocket::Sendでサーバへメッセージ送信→
CSocket::OnReceiveでサーバのメッセージ受信→
サーバメッセージから処理実行と言った流れです。
通常の処理は、この流れで問題ないのですが、
ある処理の場合、thread_startをforループで数回繰り返す
処理を行っています。
この時、データにタイムラグが出てしまうため、
thread_startから処理実行までの一連の流れが終了するまで、
次のthread_startは呼ばれずに待機させたいのですが、
どのようにすれば良いのかが分かりません。
Sendを呼んだタイミングで、
WaitForSingleObjectでスレッドのハンドルを渡したり、
CreateEventでイベントハンドルを渡したりしてみたのですが、
WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で
止まってしまうため、そのままフリーズ状態になってしまいます。
どのタイミングでWaitFor~を呼ぶべきなのか、
もしくは、何か別の手段があるのでしょうか?
No.1ベストアンサー
- 回答日時:
Event を set する関数が、待っている関数の下で呼び出されていませんか?
たまに、関数の上下関係が原因で、WaitForSinlgObjectが無限に待ってることがあります。
テストで、階層の高い位置でSetEventしてみて、フリーズ解除できるかどうか確認してみてください。
もし、動作するようならば、構造を変える必要があります。
どんな構造でどうやってるのかすら、想像できませんけど。
この回答への補足
CreateEventはthread_startを呼ぶ関数にて。
WaitForSingleObjectは、Sendを呼んだ後で。
SetEventはOnReceiveの最後に呼んでいますので、
合っていると思われます。
構造を変えるというのは、
通信手法を変えるということでしょうか?
Sendした後は、サーバがメッセージを送信すると、
自動でOnReceiveに入ってくるので、
特に何の処理も入れてなかったのですが、
Send後に、selectで受信可能になるまで待機させ、
可能になったらOnReceiveを呼ぶようにすることで、
SendからReceiveまでを一つの継続した流れで処理することで
解決しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
- サーバー メールサーバーについて詳しい方、メールサーバーの管理業務経験のある方、教えてください。 3 2022/11/12 18:24
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- JavaScript 変数のスコープの問題? 3 2022/06/23 09:32
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- 電車・路線・地下鉄 ITパスポート試験問題 7 2023/01/25 09:51
- ネットワーク ニフティメールのiPhoneとWin PCでの運用 1 2023/03/30 11:19
- その他(メールソフト・メールサービス) メールが送信できない 発信側でできる対策 3 2023/05/11 10:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハウスキープ処理について
-
別のサーバにリクエストを飛ば...
-
SNSを作るには、どのような技術...
-
CGI(Perl)のメッセージボックス...
-
NetworkStreamからのRead()で、...
-
一定時間でPostBackさせたい(A...
-
CPUを2つ搭載するといいのです...
-
フォーム上で押されたボタンに...
-
「<c:forEach タグが終了し...
-
リクエストに応じたselectedの...
-
jspからServletを呼び、元のjsp...
-
JSPからJSPへ情報を渡せる?
-
Java-jspの画面入力値保持について
-
ServletからServletへの値渡し
-
腕時計の時報をならないように...
-
三菱GOTの画面切り替えについて
-
フォームで同じ複数のnameで違...
-
ボタンが活性化の場合とは、ボ...
-
webアプリを作ってます。エラー...
-
ActiveWorkbook.Pathの一つ下の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NetworkStreamからのRead()で、...
-
ASPでDLLの呼び出し
-
ASPとCGIの違い
-
CPUを2つ搭載するといいのです...
-
<%@ language="VBScript" %>
-
IIS+VBScriptでの処理待ちについて
-
Perlで処理の進行状況をユ...
-
一定時間でPostBackさせたい(A...
-
Webサービスについて(基になる...
-
Socket通信で、通信終了のイベ...
-
画面サイズ取得について
-
RedirectとTransferの違い
-
ハウスキープ処理について
-
処理終了後、他のプログラムへP...
-
VC++のHTTP通信
-
ASP.NET MVCのAjaxフォーム検証
-
別のサーバにリクエストを飛ば...
-
PerlからDB接続し、データ登録...
-
3層クライアントサーバとMVCの関係
-
ASP.NET値の受け渡し
おすすめ情報