Windows Api多线程消息

时间:2012-11-28 11:43:50

标签: c++ multithreading winapi

我只是好奇如何在不使用Windows API WaitFor *函数的情况下实现多线程,该函数在线程返回之前停止程序。如果它们阻止主应用程序被调整大小或移动等,那么使用线程有什么意义呢?

是否有任何形式的带有线程的Windows消息传递,这将允许我调用我的线程函数然后返回,并在完成运行时处理线程的返回值?

4 个答案:

答案 0 :(得分:3)

如果您希望UI线程知道任务线程何时完成它的任务,那么您可以让任务线程将(自定义 - WM_USER及以上)消息发布到主窗口(以及线程ID和句柄)。并且主窗口的窗口proc可以知道特定任务线程已完成它的任务。这样,UI线程就不必在线程对象上主动等待(使用WaitFor *)。

答案 1 :(得分:2)

您可以使用MsgWaitForMultipleObjectsEx等待线程完成并同时处理消息。

答案 2 :(得分:1)

查看std :: thread,boost :: thread,just :: thread,一般用于c ++的多线程。

但是关于Windows消息传递win32和MFC,MSDN声明明确地 它不是多线程的,它是单线程的。 (如果使用多线程,则需要未定义的行为)

对于在主应用程序窗口线程之外的其他线程中发出的异步消息,您应该使用:: PostMessage(),它将在单线程窗口的monothread消息泵中插入消息事件。

答案 3 :(得分:1)

WaitForSingleObject可以是非阻塞的,只是将零超时作为第二个参数传递:

// Check is thread has been finished
if(::WaitForSingleObject(threadHandle, 0) == WAIT_OBJECT_0)
{
   // Process results
   ...
}

您需要定期检查此情况,例如: on timer或处理消息循环中的任何消息后。

或者您可以使用MsgWaitForMultipleObjectsEx。当在调用线程消息队列中发生某些消息/输入事件时,它将解除阻塞并返回。

正如其他提到的答案还有另一种方法 - 使用Windows异步发布的消息来表示该线程已完成其工作。这种方式有缺点 - 工作线程必须知道目标窗口或线程发布消息。这种依赖性使设计复杂化并引发有关检查线程/窗口生命周期的问题。为了避免它的消息广播(PostMessage(HWND_BROADCAST,...)) 可以使用,但这对你的情况来说太过分了,我不推荐它。