c++ - 等待线程完成而不卡住MFC中的UI

标签 c++ multithreading winapi mfc afx

我正在尝试使用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);
}
谢谢你的想法

关于c++ - 等待线程完成而不卡住MFC中的UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63391995/

相关文章:

c++ - 如何生成通过交换元素(例如 : from {0, 1,2} 到 {0,2,1})将数组更改为另一个数组的步骤?

python - 如何以编程方式停止 multiprocessing.Pool 映射函数

java - Thread.currentThread() 是如何工作的?

c++ - QThread:线程仍在运行时被销毁,QMutex 被销毁

c++ - 无法在窗口中加载 PDF

delphi - 当用键盘打开弹出窗口时,如何使 Tpopupmenu 预选第一个菜单项

c++ - 使用 qt3d 渲染一个已经加载的网格

c++ - 使用 C++ 服务器-客户端的 GET 和 PUT 命令

c++ - 返回值寄存器和析构函数调用顺序

c - 使用套接字时如何获得下载速度?