Я прошу тест, чтобы сделать индикатор выполнения для имитации загрузки. Начните загрузку, когда отобразится 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();
?