我是线程的新手,但过去几天一直在阅读它,现在我尝试在一个实际示例中实现它。
我有一个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被怀疑冻结后,我也立即加入了该线程。
做这个例子的正确方法是什么?
最佳答案
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()
来暂停/加入/重置任务。
关于c++ - C++如何通过while循环正确使用线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24982645/