• ベストアンサー

WaitForSingleObjectについて

いま、VC++2005MFCでCOMを使用したソフトを作成しています。 応答を待って次のコマンドというようなやりとりが相手側機器と必要なのですが、 COMの受信スレッドからのイベントをWaitForSingleObjectで待って次のコマンド送信 というようにやっていくとエディットボックスへのログ表示がコマンドのやり取りが一通り 終わるまで待たされてしまいます。 なにかいい方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

>WaitForSingleObjectで待って次のコマンド送信 >というようにやっていくとエディットボックスへのログ表示がコマンドのやり取りが一通り >終わるまで待たされてしまいます。 メインスレッドでWaitForSingleObjectで待つと ウィンドウズのメッセージループが止まってしまいます。(例えばボタンを押しても反応しなくなります) WaitForSingleObjectは別スレッドで動かし、それをメインスレッド側に通知する仕組みを作ると良いでしょう。 (スレッドの作成方法はAfxBeginThread(MFC)、CWinThread (MFC)、beginthread、CreateThread等で検索してみてください) 通知する仕組みは、ウインドウズメッセージを使うか 同期系のAPIを使ってグローバルなフラグを見る方法があります。 ※同期系のAPI:CriticalSection、CreateMutex、Interlock系(InterlockedIncrement等) ※ウィンドウズメッセージを使う場合はPostMessage/WM_APP/WM_USER/PostThreadMessageで検索してみてください)

nori1112
質問者

お礼

助かりました。ありがとうございました。 早速試したところうまく動くようになりました。 他のかたには申し訳ありませんが、最初に回答していただいたということで ベストアンサーに選ばせていただきました。

その他の回答 (3)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

イベント駆動にせず、ポーリングにするという手もあると思います。 WaitForSingleObjectの用法が書かれていませんので微妙ですが、 WaitForSingleObjectの待ち時間に無限待ちを指定せず、0を指定して 対象のハンドルが、シグナル状態になった時(WAIT_OBJECT_0が返されたとき)に コマンドを処理をする方法です。 これはWaitForSingleObject関数をすぐに制御を返すようにして、 結果は、待ち状態であれば0msがタイムアウトし(WAIT_TIMEOUT)が 返却されるはずなので、これを無視するという方法です。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

ウィンドウを扱うプロセス(スレッド)では、MsgWaitForMultipleObjectsかMsgWaitForMultipleObjectsExを使ってください。 # http://msdn.microsoft.com/ja-jp/library/cc429427.aspx

回答No.2

MFC は使ったことがないので、直接の回答ではなく、考え方の提示レベルになります。 ※既に回答にあるとおり、マルチスレッドで対応するのが正しいとは思います。 そこで、こんな感じでいけるのじゃないかと。 do { ・タイムアウトを短めに設定して if( GetMessage(&lpMsg, NULL, 0, 0) != 0 ) { // なにかメッセージが、たまってない確認して、あったら処理 TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } ・WaitForSingleObject(); } while(! 受信イベント発生)

関連するQ&A