1

マルチチャイルド アプリケーションを作成しました。アプリケーション ウィンドウ (W[n]: TMyWindows) はすべて同じで、すべてにプライベート オブジェクト クラス インスタンスが関連付けられています (E: TMyObject)。子ウィンドウは、このオブジェクトを通じていくつかのメッセージを生成します。メッセージの内容に応じてこれらのメッセージを処理する 2 つのスレッドをメイン アプリケーションに作成しました。たとえば、次の非同期呼び出しがあります。

W[1].E.Service(thread1service)
W[2].E.Service(thread2service)

TMyObject.Service(servicetype) は

case servicetype of
  thread1service: PostThreadMessage(thread1id,...);
  thread2service: PostThreadMessage(thread2id,...);
end;

さて、各スレッドの実行メソッドには、次のようなものがあります。

while not terminated do
begin
 ...
 if peekmessage(msg,0,thread1message_1,thread1message_n,pm_remove) then
      process message
 do other things;
end

2番目のスレッドがメッセージを受信しないことを除いて、すべてうまくいきます。理由はわかりますか?

4

3 に答える 3

1

あなたが提供している範囲が有効であることを確認しPeekMessage()ます。次のように、すべてのメッセージを受信するには、代わりにゼロを入れてみてください。

PeekMessage(msg, 0, 0, 0, PM_REMOVE)

それが機能しない場合は、PostThreadMessage()関数の結果を確認します...スレッドがまだ呼び出されていない可能性があります。これが、PeekMessage()ウィンドウにメッセージキューを作成するように促すものです。

この記事(「解説」の下) に記載されているようにPostThreadMessage()、呼び出しの結果を確認しSleep()て失敗した場合は、イベントを使用して、子スレッドがメッセージを受信する準備ができていることをメイン スレッドに通知できます。

HTH、

N@

于 2009-09-18T00:33:12.613 に答える
0

これは古い質問であることは知っていますが、コードで同様の問題が発生しました。Win 7 64 ビットで Delphi 2006 を実行しており、問題のコードには、pekmessage/postthreadmessage を介して別のアプリケーションと通信する DLL が含まれていました。

私は最終的に、管理者権限がアプリケーションまたは Delphi に付与されていることに問題を突き止めることができました。互換モードでも、管理者権限を付与する必要があるため、問題が表面化します。管理者権限が付与されている場合、管理スレッドは非管理スレッドと通信できますが、非管理スレッドは管理者権限を持つスレッドにメッセージを戻すことができません。管理者以外のアプリでの PostThreadMessage 呼び出しは成功を報告していましたが、メッセージはターゲット アプリのメッセージ キューに表示されませんでした。

解決には至りませんでしたが、幸いにも通常モードでアプリを動かすことができたので、追いつくのに時間がかかった以外は問題ありませんでした。

于 2012-04-04T16:25:00.840 に答える
0

そのため、合理的な説明が見つからなかったので、あきらめなければなりませんでした。

私は、クリティカル セクションを使用してメッセージを送信し、イベント シグナリングを使用して、作業中のスレッドに処理すべきメッセージがあることを伝えることにしました。残念ながら、これはメイン スレッドが、新しいメッセージを送信する前に、作業スレッドがメッセージを処理することを確認する必要があることを意味します。

于 2009-09-20T08:27:28.753 に答える