![](/img/trans.png)
[英]How to wait for a barcode reader input without freezing the main thread of my program?
[英]Wait for thread completion without freezing the UI in MFC
我正在嘗試使用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, 0, (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, 0, (LPARAM)2);
}
pObject->SendMessage(WM_THREAD_1, 0, (LPARAM)3);
return 0;
}
void CProgressBarSampleDlg::OnBtnStartClicked()
{
AfxBeginThread(MyControllingFunction, this);
}
謝謝你的想法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.