如何将消息发送到执行冗长操作的线程?

时间:2015-04-15 13:24:38

标签: c multithreading winapi

我有一个主线程和一个工作线程。当主线程即将终止时,我需要向工作线程发送一条消息,以便它可以干净地终止(我听说TerminateThread()是个坏主意。)

工作线程将进行冗长的操作(这将花费超过30秒),因此有一种方法可以在以某种方式执行此冗长操作时向其发送消息。或者我的程序设计错了,工作线程不应该进行这样的长度操作?

3 个答案:

答案 0 :(得分:2)

作为一般原则,不要终止线程。

您的后台工作线程可以定期检查程序是否要退出。您应该使用std::atomic<bool>来执行此操作。以下是如何使用它的示例。

#include <iostream>
#include <thread>
#include <atomic>

volatile std::atomic<bool> g_bExit(false);

void thread1()
{
   while( !g_bExit )
   {
      // do stuff here
   }
}

int main()
{
      std::thread th1(thread1);

      g_bExit = true;

      th1.join() ; // wait for thread
}

答案 1 :(得分:0)

一个简单的解决方案,但也许不是最好的解决方案是使用全局标志变量,最初为0。

当主线程完成时,将其设置为1。您的其他线程应该在循环中检查此变量。

当变量为1时,线程知道主线程已经完成。

希望它有所帮助!

答案 2 :(得分:0)

使用PostThreadMessage函数将消息发布到另一个线程。另一个线程必须是消息泵(不一定是GUI消息泵)。在目标线程中使用GetMessage来检索消息。您需要制作一个结构(更好的方法),并发送结构对象。您的结构将包含实际的消息类型(例如,开始,消息,停止等 - 枚举值集)。

或者您可以使用C ++ 14的新线程技术或使用VC ++并发运行时的unbounded_buffer。您需要探索并找到适合您的问题的解决方案。

我没有发布任何示例,因为这个域非常大。您最好在网上搜索示例,参考资料等。

编辑:我相信我最初误解了这个问题。这是我的解决方案:使用事件同步对象。在工作线程中,通过WaitForSingeObject(或WaitForMultipleObjects)等待事件。从同一同步对象上的源线程调用SetEvent。是的,C ++ std::thread

中有新的替代品