如何停止包含while(1)的线程

How to stop a thread containing a while(1)

本文关键字:线程 何停止 包含 while      更新时间:2023-10-16

我在我的类MainWindow中创建了一个启动server的线程,当我关闭这个MainWindow时,我需要停止该服务器,但我不能,因为服务器在while(true) loop中运行。因此,我看到的唯一可能是杀死包含服务器的线程。

但这仍然是不可能的,因为我使用#include <thread>C++11 .

我的解决方案是这样传递一个boolean到我的服务器,并执行循环,而这个布尔值为真。但是,当我的布尔值变为false时,我不能退出循环,因为我的服务器等待接收一个帧,而这个帧在完成循环之前没有出现。

下面是我的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //Some initialisation
...
    // Constructs the new thread and runs it. Does not block execution.
    m_t1 = std::thread(lancerServeur);
}
MainWindow::~MainWindow()
{
    delete ui;
    m_t1.join();
}

void MainWindow::lancerServeur(){
    serveur s;
    while(true){
        s.receiveDataUDP();//Wait for a frame
    }
}

那么,在c++ 11中有没有办法杀死我的线程,或者你有没有办法停止我的服务器?

谢谢。

如果它是UDP服务器,并且你想要解锁它,以便它读取一些'stop'布尔值为true,设置布尔值并在本地堆栈上发送一个UDP消息,因此解锁它。

您需要有一个主线程将发出信号的事件。然后线程等待该事件和接收帧。当等待返回时,检查导致等待结束的条件。如果是接收到一个帧,则处理该帧并再次等待。如果是线程结束事件,则退出线程。

我还不太了解新的标准线程库,还不能建议如何使用它们。对于Windows原生API,您可以使用WaitForMultipleObjects()

可以创建一个指向线程对象的指针,然后在析构函数中删除该对象。

换句话说:

    m_t1 = new std::thread(lancerServeur);
然后在析构函数中:
    m_t1->detach();
    delete m_t1;

当然,将成员变量改为指针:

    std::thread* m_t1;

或您选择的任何其他指针

编辑:你必须在你的析构函数中调用'm_t1->detach()',以确保线程在销毁时不可连接。在您给出的代码示例中,情况并非如此。