如何从另一个线程通知CDialog对象有关已完成的任务?

时间:2011-03-31 09:23:21

标签: multithreading winapi mfc

我有一个长时间运行的任务和一个Dialog,它通知用户此任务正在运行。任务完成后,Dialog会通知用户。

我想在使用AfxBeginThread创建的Worker-Thread中启动任务,当任务完成时,我将带有WM_APP + 1的用户消息PostMessage发布到Dialog。好的PostMessage只能在同一个线程中使用,因此我尝试了PostThreadMessage,但在对话框中使用ON_THREAD_MESSAGE时出现编译错误。

现在我不知道如何继续。你有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用PostMessage(),它会起作用。 gui线程将处理该消息。

我相信PostMessage的文档很清楚:

  

在邮件中放置(发布)邮件   与之关联的消息队列   创建指定的线程   窗口并无需等待即可返回   处理消息的线程。

因此,如果工作人员在窗口的消息队列中放置消息,则 创建窗口的线程将处理该消息 在你的情况下,它是主要(或gui)线程。

答案 1 :(得分:2)

PostMessage()SendMessage()都会异步或同步地向窗口句柄传递消息。

窗口句柄具有线程关联性。这意味着任何与窗口句柄交互的代码都必须从拥有窗口的线程运行,即创建窗口的线程。

PostMessage()SendMessage()通过确保在处理消息时由拥有该窗口的线程处理它来处理此问题。

PostMessage()来说,这是一项简单的任务。每个线程都有自己的个人消息队列。当您调用PostMessage()时,系统只是将消息放在属于拥有该窗口的线程的消息队列中。然后在线程泵送其消息队列时稍后处理该消息。

对于SendMessage(),安排消息由正确的线程处理更加困难。如果从拥有该窗口的线程调用SendMessage(),则直接调用窗口过程。否则,系统会通知另一个线程需要运行同步消息然后阻塞。另一个拥有该窗口的线程仅在进行某些系统调用时处理该消息,该系统调用检测到消息正在等待的事实。这意味着对SendMessage()的跨线程调用可能会导致性能问题。