首页 > 解决方案 > 当 PostMessage 在线程中返回时,消息肯定在接收者的消息队列中吗?

问题描述

这是我在这里的第二个问题,希望我没有搞砸任何事情!

这个问题是理论上的,因为我的实现看起来很完美,我只是想确定它没问题。

我创建了多个线程,作为他们对主线程的 PostMessage() 工作的一部分。然后主线程等待所有线程终止。在所有线程终止后,主线程调用 Application.ProcessMessages。所以问题是在这个电话之后是否确定收到了所有的消息?

标签: multithreadingdelphiwinapipostmessage

解决方案


如果PostMessage()返回非零,则保证消息已放入拥有被发布到的窗口的线程的消息队列中。

Application.ProcessMessages()是一个阻塞函数。在调用线程的消息队列完全清除未决消息之前,它不会退出。

现在,一条发布的消息是否真的到达它发布到的窗口的消息过程是另一回事。有一些因素可以防止这种情况发生。错误的消息队列过滤。在从队列中删除消息之前被销毁的窗口。等等。但是,鉴于您描述的示例,这些都不太可能发生。

所以是的,一旦所有线程完全终止,并且随后的调用Application.ProcessMessages()已经退出,您就可以保证不会从线程收到任何进一步的消息。


推荐阅读