1

我创建了一个多子应用程序。应用程序窗口 (W[n]: TMyWindows) 都是相同的,并且都有一个与之关联的私有对象类实例 (E: TMyObject)。子窗口通过这个对象生成一些消息。我在主应用程序中创建了两个线程,它们根据消息的内容处理这些消息。例如,让我们有以下异步调用:

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

一切都很好,除了第二个线程没有收到任何消息。你知道为什么吗?

4

3 回答 3

1

我会检查以确保您提供的范围PeekMessage()是有效的。尝试输入零来接收所有消息,如下所示:

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

如果这不起作用,我会检查PostThreadMessage()函数的结果......可能是线程尚未调用PeekMessage(),这就是提示窗口为您创建消息队列的原因。

本文所述(在“备注”下),您可以检查对 的调用的结果PostThreadMessage()以及Sleep()是否失败,或者使用事件向主线程发出信号,表明子线程已准备好接收消息。

高温下,

N@

于 2009-09-18T00:33:12.613 回答
0

所以,我不得不放弃,因为我没有找到任何合理的解释。

我决定使用带有事件信号的关键部分发送消息,以告诉工作线程他们有消息要处理。不幸的是,这意味着主线程必须在发送新消息之前检查工作线程是否处理了任何消息。

于 2009-09-20T08:27:28.753 回答
0

我知道这是一个老问题,但我在我们的代码中遇到了类似的问题。我们在 Win 7 64 位上运行 Delphi 2006,有问题的代码涉及通过 peekmessage/postthreadmessage 与单独的应用程序通信的 DLL。

我最终设法将问题追溯到授予应用程序或 Delphi 的管理员权限。兼容模式也会导致问题浮出水面,因为它需要授予管理员权限。如果授予管理员权限,则管理员线程可以与非管理员线程通信,但非管理员线程不能将消息发回具有管理员权限的线程。非管理员应用程序上的 PostThreadMessage 调用报告成功,但消息从未出现在目标应用程序的消息队列中。

我还没有解决这个问题,但幸运的是能够在正常模式下运行应用程序,所以除了在追查过程中浪费了时间之外,这不是问题。

于 2012-04-04T16:25:00.840 回答