我想在发出信号时停止循环线程,所以这是我的代码
void MyThread::stopWatchingThread()
{
qDebug()<<"MyThread::stopWatchingThread()";
Keep_running=false;
qDebug()<<"MyThread::stopWatchingThread Keep_running"<<Keep_running;
...
}
void MyThread::run()
{
qDebug()<<"MyThread::run()";
qDebug()<<"MyThread::run Keep_running"<<Keep_running;
while(Keep_running)
{
...
}
qDebug()<<"MyThread::run Keep_running"<<Keep_running;
Keep_running=false;
qDebug()<<"MyThread::run Keep_running"<<Keep_running;
}
void Watcher::Init()
{
WatchingThread=new MyThread(this->L_RootToWatch);
connect(this,SIGNAL(stopmonotiring()),WatchingThread, SLOT(stopWatchingThread()));
...
}
void Watcher::StartWatching()
{
WatchingThread->start();
}
void Watcher::StopWatching()
{
emit stopmonotiring();
}
所以每件事情都可以,但我的问题是Keep_running
false
在MyThread::run()
之后永远不会获得stopWatchingThread
值,因此while
循环播放。
我错过了什么 ?
任何帮助将不胜感激。
答案 0 :(得分:1)
由于您的run()方法阻塞且事件循环从未进入,因此永远不会调用slot stopWatchingThread。您必须调用exec(),而不是通过run()中的旋转循环来阻止事件循环。要么是这样,要么让观察者线程直接调用stopWatchingThread而不是使用信号/插槽连接。我会选择后者。 keepRunning将从多个线程访问,因此您必须使用QMutex,QReadWriteLock或QAtomic保护它。 (从QMutex开始,这是最简单的。)
答案 1 :(得分:0)
如果在线程中使用事件循环,只需将quit()
信号发布到线程对象。
答案 2 :(得分:0)
也许您的C ++编译器会优化Keep_running
上的读取操作。尝试将其声明为volatile
,它告诉编译器此变量可能会“意外地”更改,例如来自其他线程或硬件中断。