首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通知CDialog对象来自另一个线程的已完成任务?

如何通知CDialog对象来自另一个线程的已完成任务?
EN

Stack Overflow用户
提问于 2011-03-31 17:23:21
回答 2查看 648关注 0票数 2

我有一个长时间运行的任务和一个对话框,它通知用户这个任务正在运行。当任务完成时,对话框将通知用户。

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

现在我不知道该怎么继续了。你有什么意见建议?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-31 17:31:35

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

我相信PostMessage的文档是很清楚的:

在与创建指定窗口的线程相关联的消息队列中放置(发布)一条消息,并在不等待该线程处理该消息的情况下返回。

因此,如果工作程序将消息放入窗口的消息队列中,

创建窗口的线程将处理该消息。

在您的例子中,它是主(或gui)线程。

票数 5
EN

Stack Overflow用户

发布于 2011-03-31 19:10:47

PostMessage()SendMessage()都以异步或同步的方式向窗口句柄传递消息。

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

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

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

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

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

https://stackoverflow.com/questions/5497674

复制
相关文章

相似问题

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