首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >delphi 2006中的postthreadmessage和peekmessage问题

delphi 2006中的postthreadmessage和peekmessage问题
EN

Stack Overflow用户
提问于 2009-09-17 16:55:58
回答 3查看 3.1K关注 0票数 1

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

代码语言:javascript
复制
W[1].E.Service(thread1service)
W[2].E.Service(thread2service)

TMyObject.Service(服务类型)是

代码语言:javascript
复制
case servicetype of
  thread1service: PostThreadMessage(thread1id,...);
  thread2service: PostThreadMessage(thread2id,...);
end;

现在,在每个线程的Execute方法中,我有类似这样的东西:

代码语言:javascript
复制
while not terminated do
begin
 ...
 if peekmessage(msg,0,thread1message_1,thread1message_n,pm_remove) then
      process message
 do other things;
end

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

EN

回答 3

Stack Overflow用户

发布于 2009-09-18 00:33:13

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

代码语言:javascript
复制
PeekMessage(msg, 0, 0, 0, PM_REMOVE)

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

正如this article中所述(在“备注”部分),您可以检查调用PostThreadMessage()的结果,如果调用失败,则检查Sleep(),或者使用事件通知主线程子线程已准备好接收消息。

HTH,

N@

票数 1
EN

Stack Overflow用户

发布于 2009-09-20 08:27:29

因此,我不得不放弃,因为我找不到任何合理的解释。

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

票数 0
EN

Stack Overflow用户

发布于 2012-04-05 00:25:01

我知道这是一个老问题,但我在我们的代码中也遇到了类似的问题。我们在Win7 64位操作系统上运行Delphi 2006,所讨论的代码涉及通过peekmessage/postthreadmessage与单独的应用程序进行通信的DLL。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1440071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档