繁体   English   中英

我如何知道线程是否在C ++中停止?

[英]How do I know if a thread stopped in C++?

我进行了测试,制作了一个用于模拟下载的进度条。 显示ProgressBar时开始下载。

void CProgressBarTest::DoDataExchange(CDataExchange* pDX)
{
...
    auto funDownloadCallback = [&](int i)->int {
        if (m_downloadStopFlag)
        {
            return -1;
        }
        m_progress_bar.SetPos(i);
        return i;
    };
    std::thread thDownload(__HeavyWork::SimulateDownload, funDownloadCallback);
    thDownload.swap(m_thDownload);
}

单击取消按钮或关闭窗口时停止下载。

void CProgressBarTest::OnClose()
{
    m_downloadStopFlag = true;
    m_thDownload.join();//How do I know if the thread alread stopped. If the thread stopped, it would crash.
    CDialog::OnClose();
}

在这里,我使用一个标志(m_downloadStopFlag)告诉线程停止。 并使用m_thDownload.join(); 等待线程停止。 停止下载工作正常。

但是,如果我等待下载完成(线程也完成了),则关闭此对话框,仍然会调用m_thDownload.join(); 导致崩溃。

我如何知道线程是否完成,然后可以跳过m_thDownload.join();

如果线程已经完成, join不会引发异常,它仅在已经调用join或线程从未启动时引发,您可以使用joinable检测这些条件。 以下内容永远不会引发join异常:

if (thread.joinable())
{
  thread.join();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM