c++ - 我如何知道线程是否在 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();
}
推荐阅读
- javascript - 谷歌电子表格空行后的所有行都未定义
- c# - Xamarin.Forms.GoogleMaps 无法在 IOS 上启动,UpdateIsShowingUser 中断
- arduino - 如何将域重定向到我在 ESP 上的公共 IPAddress?
- macos - 如何获取现有 MacOs 应用程序的功能列表
- numpy - 如何在内存中加载一个大的 h5 文件?
- python - 如果需要,我想在 python 中重复某个 if 语句
- html - 将多个掩码图像应用于单个 div
- javascript - Moment.js 增加两个星期而不改变时间
- unix - awk/sed/grep 在第二个分号分隔的部分/列的字符串中搜索子字符串,并仅返回第一部分/列加上子字符串
- laravel - child 的孩子的 Eloquent 最大值