2

XPで実行しています。呼び出しを呼び出しCoInitializeEx(NULL, COINIT_MULTITHREADED)、(ローカル)DCOMオブジェクトをロードし、DCOMオブジェクトがイベントを送り返すことができるようにイベントインターフェイスをアタッチするクライアントがあります。クライアントはメモ帳によく似ており、イベントメッセージを表示するためにクライアント領域をカバーする複数行のテキストボックスがあります。ロックアップを作成する呼び出しは次のとおりです。

  • クライアントがp->DoStuff()DCOMオブジェクトを呼び出します。
  • DCOMオブジェクトはc->DoStuffEvent()、処理中にクライアントを呼び出しますDoStuff()
  • クライアントEM_REPLACESELは子テキストボックスにメッセージを送信して、「何かが起こっています」と表示させます

クライアントはでフリーズしますSendMessage(EM_REPLACESEL)。クライアントのへの呼び出しp->DoStuff()はメインスレッドでSendMessage(EM_REPLACESEL)実行されますが、は別のスレッドで実行されます。これは問題と関係があると確信しています。

誰かがロックの原因と私がそれを回避する方法を説明できますか?クライアントオブジェクトとDCOMオブジェクトは私がMSVC/ATLでコーディングしているので、必要に応じて両方を変更できます。

4

2 に答える 2

3

ウィンドウはメインスレッドによって作成されたように見えます。つまり、これがwindowprocを呼び出すことができる唯一のスレッドです。他のスレッドからの場合、メッセージをメインスレッドのキューに入れ、メインスレッドがまたはSendMessageを呼び出すのを待つために実際に行うこと。またはへの呼び出しの中で、Windowsは待機中のクロススレッドに気づき、そのメッセージをウィンドウプロシージャに渡します。次に、2番目のスレッドをウェイクアップし、続行させます。GetMessagePeekMessageGetMessagePeekMessageSendMessage

の戻り値を気にしない場合は、代わりにSendNotifyMessageSendMessage(EM_REPLACESEL)を使用できます。ただし、これを行う場合は、メッセージとともに渡す文字列が、メッセージが最終的に配信されたときに引き続き有効であることを確認する必要があります。EM_REPLACESEL

于 2010-02-23T18:13:14.433 に答える
1

SendMessageのドキュメントによると、SendMessageは関数が完了するまで返されません。同期です。UIスレッドでも常に回答されていると思います。非同期メッセージパスを実行する場合は、PostMessageを使用する必要があります。

于 2010-02-23T18:07:58.737 に答える