簡體   English   中英

等待線程完成而不凍結MFC中的UI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM