如何解决等待线程完成而不冻结MFC中的UI
我正在尝试使用AfxBeginThread
启动辅助线程,并等待其完成。但是我遇到了一个问题,我可以在没有线程控制的情况下更新UI(显示进度),或者等待线程但UI冻结。我发现了几种获取完成的方法,但是它们都使用WaitForSingleObject
。还有其他解决方案吗?这是我的示例代码:
UINT CProgressBarSampleDlg::MyControllingFunction(LPVOID pParam)
{
CProgressBarSampleDlg* pObject = (CProgressBarSampleDlg*)pParam;
for (size_t i = 0; i < 10; i++)
{
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // simulate long running operation
pObject->m_ProgressBar.StepIt(); // update progress
}
return 0;
}
void CProgressBarSampleDlg::OnBtnStartClicked()
{
auto thread = AfxBeginThread(MyControllingFunction,this);
// ... this freezes the UI!
thread->m_bAutoDelete = FALSE;
WaitForSingleObject(thread->m_hThread,INFINITE);
delete thread;
}
解决方法
好吧,在理查德的建议下,我以这种方式解决了这个问题。此外,进度条访问权限已移至消息处理程序中。
UINT CProgressBarSampleDlg::MyControllingFunction(LPVOID pParam)
{
CProgressBarSampleDlg* pObject = (CProgressBarSampleDlg*)pParam;
pObject->SendMessage(WM_THREAD_1,(LPARAM)1);
for (size_t i = 0; i < 10; i++)
{
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // simulate long running operation
pObject->SendMessage(WM_THREAD_1,(LPARAM)2);
}
pObject->SendMessage(WM_THREAD_1,(LPARAM)3);
return 0;
}
void CProgressBarSampleDlg::OnBtnStartClicked()
{
AfxBeginThread(MyControllingFunction,this);
}
感谢您的想法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。