我进行了测试,制作了一个用于模拟下载的进度条。显示进度条时开始下载。
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();
?
答案 0 :(得分:1)
join
不会在线程已完成的情况下引发异常,仅在调用join
或从未启动线程时才会引发异常,您可以使用{{ 3}}。以下内容永远不会引发join
的异常:
if (thread.joinable())
{
thread.join();
}