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