dポイントプレゼントキャンペーン実施中!

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

A 回答 (4件)

>WaitForSingleObjectで待って次のコマンド送信


>というようにやっていくとエディットボックスへのログ表示がコマンドのやり取りが一通り
>終わるまで待たされてしまいます。

メインスレッドでWaitForSingleObjectで待つと
ウィンドウズのメッセージループが止まってしまいます。(例えばボタンを押しても反応しなくなります)
WaitForSingleObjectは別スレッドで動かし、それをメインスレッド側に通知する仕組みを作ると良いでしょう。
(スレッドの作成方法はAfxBeginThread(MFC)、CWinThread (MFC)、beginthread、CreateThread等で検索してみてください)

通知する仕組みは、ウインドウズメッセージを使うか
同期系のAPIを使ってグローバルなフラグを見る方法があります。
※同期系のAPI:CriticalSection、CreateMutex、Interlock系(InterlockedIncrement等)
※ウィンドウズメッセージを使う場合はPostMessage/WM_APP/WM_USER/PostThreadMessageで検索してみてください)
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/11 08:59

イベント駆動にせず、ポーリングにするという手もあると思います。


WaitForSingleObjectの用法が書かれていませんので微妙ですが、
WaitForSingleObjectの待ち時間に無限待ちを指定せず、0を指定して
対象のハンドルが、シグナル状態になった時(WAIT_OBJECT_0が返されたとき)に
コマンドを処理をする方法です。

これはWaitForSingleObject関数をすぐに制御を返すようにして、
結果は、待ち状態であれば0msがタイムアウトし(WAIT_TIMEOUT)が
返却されるはずなので、これを無視するという方法です。
    • good
    • 0

ウィンドウを扱うプロセス(スレッド)では、MsgWaitForMultipleObjectsかMsgWaitForMultipleObjectsExを使ってください。


# http://msdn.microsoft.com/ja-jp/library/cc429427 …
    • good
    • 0

MFC は使ったことがないので、直接の回答ではなく、考え方の提示レベルになります。


※既に回答にあるとおり、マルチスレッドで対応するのが正しいとは思います。

そこで、こんな感じでいけるのじゃないかと。


do
{
・タイムアウトを短めに設定して
if( GetMessage(&lpMsg, NULL, 0, 0) != 0 )
{ // なにかメッセージが、たまってない確認して、あったら処理
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
・WaitForSingleObject();
} while(! 受信イベント発生)
    • good
    • 0

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