2011-03-31 60 views
2

我有一个长时间运行的任务和一个通知用户这个任务正在运行的对话框。任务完成后,Dialog会通知用户。如何通知CDialog对象有关从另一个线程完成的任务?

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

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

谢谢!

回答

5

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

我相信PostMessage文件是明确的:

地方(职位)在与创建指定 窗口并返回,而无需等待 线程的 线程相关联的 消息队列中的消息处理该消息。

所以,如果工人在一个窗口的消息队列中放置一个消息,
其创建的窗口将处理消息的线程。
在你的情况下,它是主要的(或gui)线程。

+0

我错了,PostMessage工作正常。问题是,我将一个NULL窗口句柄传递给PostMessage。在创建对话框之前我调用了'GetSafeHwnd'。谢谢你的回答,我找错了方向找出原因。 – 2011-03-31 11:33:40

2

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

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

PostMessage()SendMessage()通过确保消息处理完成后由拥有该窗口的线程处理。

对于PostMessage()这是一个简单的任务。每个线程都有自己的个人消息队列。当您致电PostMessage()时,系统只会将消息放置在属于拥有该窗口的线程的消息队列中。然后在线程抽取其消息队列时稍后处理该消息。

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

相关问题