如何停止包含while(1)的线程
How to stop a thread containing a while(1)
我在我的类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()',以确保线程在销毁时不可连接。在您给出的代码示例中,情况并非如此。
相关文章:
- 线程之间的布尔停止信号
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- C++ 线程创建/删除与线程停止/恢复
- AMQP-CPP,libev >停止ev_loop来自另一个线程
- 子线程中的条件变量等待停止主线程中的执行
- 停止 winapi 线程时出现错误行为
- 如何从两个平行的线程中停止一个线程
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- 停止C++中的特定线程
- Qt:向死/停止线程发送信号
- Openmp:所有线程由于一个线程中的延迟而停止
- 如何在无限循环中启动和停止(切换)多个线程
- 停止当前正在运行的线程C
- 事件发生时停止线程
- C++,pthreads:如何从多个线程停止工作线程
- 在C 中停止定期线程
- 线程-如何停止工人
- 如果一个且只有一个线程被停止,可以从多线程进程中跟踪读/写数据