2

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

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

4

4 回答 4

3

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

于 2012-11-28T11:53:51.213 回答
2

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

于 2012-11-28T11:53:03.887 回答
1

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

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

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

于 2012-11-28T11:50:28.493 回答
1

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

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

您将需要定期检查此情况,例如在计时器上或在消息循环中处理任何消息之后。

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

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

于 2012-11-28T11:58:01.010 回答