我创建了一个多媒体应用程序。应用程序窗口(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
一切顺利,第二个线程没有收到任何消息。 你知道为什么吗?
答案 0 :(得分:1)
我会检查以确保您提供给PeekMessage()
的范围是有效的。尝试将零写入以接收所有消息,如下所示:
PeekMessage(msg, 0, 0, 0, PM_REMOVE)
如果这不起作用,我会检查PostThreadMessage()
函数的结果......可能是线程还没有调用PeekMessage()
,这就是提示窗口创建的消息队列。
如this article中所述(在“备注”下),您可以检查调用PostThreadMessage()
的结果,Sleep()
是否失败,或使用事件发出信号到子线程已准备好接收消息的主线程。
HTH,
N - [
答案 1 :(得分:0)
所以,我不得不放弃,因为我没有找到任何合理的解释。
我决定使用带有事件信令的关键部分发送消息,告诉工作线程他们有要处理的消息。不幸的是,这意味着主线程必须在发送新消息之前检查工作线程是否处理任何消息。
答案 2 :(得分:0)
我知道这是一个老问题,但我的代码中遇到了类似的问题。我们在Win 7 64位上运行Delphi 2006,并且有问题的代码涉及通过peekmessage / postthreadmessage与单独的应用程序通信的DLL。
我最终设法将问题追溯到授予应用程序或Delphi的管理员权限。兼容模式也会导致问题浮出水面,因为它需要授予管理员权限。如果授予管理员权限,管理员线程可以与非管理员线程通信,但非管理员线程无法将消息发回给具有管理员权限的线程。非管理员应用程序上的PostThreadMessage调用报告成功,但该消息从未出现在目标应用程序的消息队列中。
我还没有解决这个问题,但幸运的是能够以正常模式运行应用程序,所以除了追逐它的时间之外,它不是一个问题。