向同一进程中的另一个线程发出信号

Posted

技术标签:

【中文标题】向同一进程中的另一个线程发出信号【英文标题】:Signal another thread within the same process 【发布时间】:2015-07-06 05:34:41 【问题描述】:

我有一个应用程序可以处理某些数据,并将其显示在 UI 中。

最初我只有一个线程,即主进程,负责完成工作,即检索数据进行处理,处理数据,然后更新 UI。数据位于另一台服务器上。

但是,应用程序的要求发生了变化,需要从服务器检索和处理的数据比以前想象的要多得多。这会产生性能问题,因为必须检索、处理数据,然后 UI 必须确定应该将其放置在哪里

UI 是基于 CListCtrl 的 MFC 控件。

为了解决这个问题,我将处理分为两个线程,一个用于获取数据并处理它,另一个用于显示它,即 GUI。

我需要某种方式向UI 线程发出信号,表明数据已被提取和处理。该线程是使用CreateThread 创建的。向其他线程发出信号表明它可以完成自己的工作的最佳方式是什么?

【问题讨论】:

【参考方案1】:

我建议如下:当您的单独线程必须通知 GUI 某些事情时,您应该调用 PostMessage 到包含控件的窗口。

消息参数应该是用户定义的消息,因此由您定义,例如

#define WM_MYMESSAGE (WM_USER + 1)

另外两个参数(LPARAM 和 LPARAM)将包含您需要传递给 GUI 的数据。因此,在 CreateThread 中,您需要传递一些有关将接收消息的窗口的信息(如果您使用 MFC,则为 CWnd 指针,否则为 HWND 句柄)。

然后你需要在你的窗口中处理这个消息(参见关于 ON_COMMAND 和类似宏的参考资料)

【讨论】:

OK - 所以在我需要发送通知的地方,我做了一个PostMessage(this->GetSafeHwnd(), WM_COMPLETE, 0, 0)' . Also, I have defined a 'ON_MESSAGE(WM_COMPLETE, &someClass::someFunc()),其中someFunc()LRESULT someFunc(WPARAM, LPARAM)。我执行了该应用程序,但不知何故,尽管输入了breakpoint,但它似乎并没有达到该功能。我感觉窗口的句柄是问题,但它是 CDialog 派生类,我在创建处理线程之前在 InitDoalog() 中使用 getSafeHwnd() 获取句柄。可能是问题 除了,WM_USER+x 不适合应用程序使用。此范围的消息供窗口实现使用。请改用WM_APP+x @user:事实证明,对于一个对话框,WM_USER+1 实际上是DM_SETDEFID,一个已经附加到消息处理程序的消息。正如我在之前的评论中所指出的,marom 选择了错误的消息范围。请改用WM_APP+1

以上是关于向同一进程中的另一个线程发出信号的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个进程向多个其他进程发出信号?

有没有办法从另一个进程向线程发送信号?

从另一个 Java 进程发出信号

多线程和进程信令

如果线程在内核中实现,可以使用内核信号量对同一个进程中的两个线程进行同步吗?

从一个进程向另一个 C++ 发出信号