我创建了一个多孩子的应用程序。应用程序窗口(Wn: TMyWindows)都是相同的,并且都有一个与之关联的私有对象类实例(E: TMyObject)。子窗口通过这个对象生成一些消息。我在主应用程序中创建了两个线程,它们根据消息的内容处理这些消息。例如,让我们使用以下异步调用:
W[1].E.Service(thread1service)
W[2].E.Service(thread2service)TMyObject.Service(服务类型)是
case servicetype of
thread1service: PostThreadMessage(thread1id,...);
thread2service: PostThreadMessage(thread2id,...);
end;现在,在每个线程的Execute方法中,我有类似这样的东西:
while not terminated do
begin
...
if peekmessage(msg,0,thread1message_1,thread1message_n,pm_remove) then
process message
do other things;
end一切正常,除了第二个线程没有接收到任何消息。你知道为什么吗?
发布于 2009-09-18 00:33:13
我将检查以确保您提供给PeekMessage()的范围有效。尝试将零放入以接收所有消息,如下所示:
PeekMessage(msg, 0, 0, 0, PM_REMOVE)如果这不起作用,我将检查PostThreadMessage()函数的结果...这可能是因为线程还没有调用PeekMessage(),这就是提示窗口为你创建消息队列的原因。
正如this article中所述(在“备注”部分),您可以检查调用PostThreadMessage()的结果,如果调用失败,则检查Sleep(),或者使用事件通知主线程子线程已准备好接收消息。
HTH,
N@
发布于 2009-09-20 08:27:29
因此,我不得不放弃,因为我找不到任何合理的解释。
我决定使用带有事件信号的临界区发送消息,以告诉工作线程它们有一个消息要处理。不幸的是,这意味着在发送新的消息之前,主线程必须检查工作线程是否处理了任何消息。
发布于 2012-04-05 00:25:01
我知道这是一个老问题,但我在我们的代码中也遇到了类似的问题。我们在Win7 64位操作系统上运行Delphi 2006,所讨论的代码涉及通过peekmessage/postthreadmessage与单独的应用程序进行通信的DLL。
我最终设法将问题追溯到授予应用程序或Delphi的管理员权限。兼容模式也会导致问题浮出水面,因为它需要授予管理员权限。如果授予admin权限,则admin线程可以与非admin线程通信,但非admin线程无法向具有admin权限的线程回发消息。对非管理应用程序的PostThreadMessage调用报告成功,但该消息从未出现在目标应用程序的消息队列中。
我还没有解决这个问题,但幸运的是能够在正常模式下运行应用程序,所以这不是一个问题,只是在追查它的过程中浪费了时间。
https://stackoverflow.com/questions/1440071
复制相似问题