我有一个长时间运行的任务和一个Dialog,它通知用户此任务正在运行。任务完成后,Dialog会通知用户。
我想在使用AfxBeginThread
创建的Worker-Thread中启动任务,当任务完成时,我将带有WM_APP + 1
的用户消息PostMessage
发布到Dialog。好的PostMessage
只能在同一个线程中使用,因此我尝试了PostThreadMessage
,但在对话框中使用ON_THREAD_MESSAGE
时出现编译错误。
现在我不知道如何继续。你有什么建议吗?
谢谢!
答案 0 :(得分:5)
您可以使用PostMessage()
,它会起作用。 gui线程将处理该消息。
我相信PostMessage的文档很清楚:
在邮件中放置(发布)邮件 与之关联的消息队列 创建指定的线程 窗口并无需等待即可返回 处理消息的线程。
因此,如果工作人员在窗口的消息队列中放置消息,则 创建窗口的线程将处理该消息 在你的情况下,它是主要(或gui)线程。
答案 1 :(得分:2)
PostMessage()
和SendMessage()
都会异步或同步地向窗口句柄传递消息。
窗口句柄具有线程关联性。这意味着任何与窗口句柄交互的代码都必须从拥有窗口的线程运行,即创建窗口的线程。
PostMessage()
和SendMessage()
通过确保在处理消息时由拥有该窗口的线程处理它来处理此问题。
对PostMessage()
来说,这是一项简单的任务。每个线程都有自己的个人消息队列。当您调用PostMessage()
时,系统只是将消息放在属于拥有该窗口的线程的消息队列中。然后在线程泵送其消息队列时稍后处理该消息。
对于SendMessage()
,安排消息由正确的线程处理更加困难。如果从拥有该窗口的线程调用SendMessage()
,则直接调用窗口过程。否则,系统会通知另一个线程需要运行同步消息然后阻塞。另一个拥有该窗口的线程仅在进行某些系统调用时处理该消息,该系统调用检测到消息正在等待的事实。这意味着对SendMessage()
的跨线程调用可能会导致性能问题。