gpt4 book ai didi

c++ - 如何使用 WaitForSingleObject()

转载 作者:行者123 更新时间:2023-11-30 02:37:02 27 4
gpt4 key购买 nike

我阅读了有关使用 WaitForSingleObject() 的不同主题,但我仍然不明白为什么我不能让它工作。我有一个使用 AfxBeginThread 更新的进度条,我想在执行另一个进程之前等待完成它的工作。我的代码基于此示例:http://www.codeproject.com/Articles/2459/Using-AfxBeginThread-with-class-member-controlling

startupEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
THREADSTRUCT *_param = new THREADSTRUCT;
_param->_this = this;
CWinThread* thread = AfxBeginThread (StartThread, _param);
WaitForSingleObject(startupEvent , INFINITE);
AfxMessageBox(_T("This message should pop up after the thread terminates."));

我在头文件中定义了 startupEvent 变量,如下所示:

protected:
HANDLE startupEvent;

这里是线程方法。

UINT CView::StartThread (LPVOID param)
{
THREADSTRUCT* ts = (THREADSTRUCT*)param;
::SetEvent(ts->_this->startupEvent);
//Some heavy calculation from here + ProgressBar update
return 1;
}

在上面的示例中,我希望 MessageBox 在线程终止进程之后出现,但它目前出现在之前。

最佳答案

您问题的简短回答:您需要调用 ::SetEvent(ts->_this->startupEvent);繁重的计算之后,否则 WaitForSingleObject 将在繁重的计算开始之前返回。

旁注:您可以直接在线程句柄上使用WaitForSingleObject,因此您不需要额外的事件。喜欢:WaitForSingleObject(thread->m_hThread, INFINITE);

不良做法

您的解决方案包含 2 个不良做法:

  1. 阻塞您的主线程是个坏主意,因为它运行主消息循环,而主消息循环又负责重绘 GUI 元素(例如在您的案例中更新进度条)。让主线程等待工作线程完成会破坏将繁重的计算卸载到辅助线程的原因。

  2. 不要从工作线程接触 GUI。工作线程可以使用 SendMessagePostMessage 将状态消息发送到主线程,主线程又会更新 UI。我找到了一个旧的但仍然相关的 article关于这件事。

关于c++ - 如何使用 WaitForSingleObject(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com