gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:44:12 25 4
gpt4 key购买 nike

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

我有一个 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
}
}

我觉得这不是执行此操作的正确方法。如果我分离线程,我无法通过 bool 值停止它,如果我怀疑我的 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++ 如何在 while 循环中正确使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24982645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com