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

Multithreading 如何从另一个线程向CDialog对象通知已完成的任务?,multithreading,winapi,mfc,Multithreading,Winapi,Mfc,我有一个长时间运行的任务和一个对话框,通知用户该任务正在运行。任务完成后,该对话框将通知用户该任务 我想在使用AfxBeginThread创建的工作线程中启动任务,当任务完成后,我将带有PostMessage的用户消息WM_APP+1发布到对话框中。显然PostMessage只能在同一个线程中使用,因此我尝试了postmreadmessage,但在对话框中对线程消息使用时出现了编译器错误 现在我不知道如何继续。你有什么建议吗 谢谢 您可以使用PostMessage(),它会工作的。gui线程将处

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

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

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


谢谢

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

我认为以下文件是明确的:

将消息放置(发布)到 与关联的消息队列 创建指定线程的线程 窗口,无需等待即可返回 处理消息的线程

因此,如果工作者将消息放入窗口的消息队列中,
创建窗口的线程将处理该消息。
在您的情况下,它是主(或gui)线程。
PostMessage()
SendMessage()
都以异步或同步方式将消息传递到窗口句柄

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

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

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


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

我错了,PostMessage可以正常工作。问题是,我向PostMessage传递了一个空窗口句柄。在创建对话框之前,我调用了
GetSafeHwnd
。谢谢你的回答,我找错了原因。