C ++如何使用while循环正确使用线程

时间:2014-07-27 15:52:20

标签: c++ multithreading

我是线程的新手,但过去几天我一直在阅读它,我现在正试图在一个实际的例子中实现它。

我有一个GUI类,单击一个按钮就可以启动一个线程。我的实现如下:

void Interface::on_startButton_clicked()
{    
    theDetector.start();    
}
void Interface::on_stopButton_clicked()
{    
    //not sure how to stop the thread
}

然后,Detector类具有以下代码:

void Detector::start()
{
    thread t1(&Detector::detectingThread, this);
    t1.detach();
}

void Detector::detectingThread()
{
    isActive = true;

    while (isActive){
       //run forever and do some code
       //until bool is set to false by pressing the stop button
    }
}

我觉得这不是正确的方法。如果我分离线程,我就不能通过布尔值来停止它,如果我在我的GUI冻结后立即加入它,就像我怀疑的那样。 这个例子的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

TheDetector应该有std::unique_ptr<std::thread> pThread;std::atomic<bool> halt;

如果有Start,则

pThread应该不执行任何操作。如果没有,halt=false; pThread.reset(new std::thread(&Detector::Task, this));

不要分离 - 这不是一个好主意。

Stop中,设置halt=true;,然后设置if (pThread) { pThread->join(); pThread.reset(); }

Detector::Task中,循环while (!halt)

如果Task中的代码更复杂且单个循环可能太长而无法等待UI停用,则您需要将join推迟到其他方法。

您还需要添加Detector::~Detector()来暂停/加入/重置任务。