Как узнать, остановился ли поток в C ++? - PullRequest
0 голосов
/ 13 июня 2019

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

1 Ответ

1 голос
/ 13 июня 2019

join не генерирует исключение, если поток уже завершен, он генерирует только тогда, когда join уже был вызван или поток никогда не был запущен, вы можете обнаружить эти условия с помощью joinable.Следующее никогда не должно вызывать исключение из join:

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