如何停止循环线程

时间:2013-01-23 08:35:45

标签: c++ qt qthread

我想在发出信号时停止循环线程,所以这是我的代码

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 falseMyThread::run()之后永远不会获得stopWatchingThread值,因此while循环播放。 我错过了什么 ? 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

由于您的run()方法阻塞且事件循环从未进入,因此永远不会调用slot stopWatchingThread。您必须调用exec(),而不是通过run()中的旋转循环来阻止事件循环。要么是这样,要么让观察者线程直接调用stopWatchingThread而不是使用信号/插槽连接。我会选择后者。 keepRunning将从多个线程访问,因此您必须使用QMutex,QReadWriteLock或QAtomic保护它。 (从QMutex开始,这是最简单的。)

答案 1 :(得分:0)

如果在线程中使用事件循环,只需将quit()信号发布到线程对象。

答案 2 :(得分:0)

也许您的C ++编译器会优化Keep_running上的读取操作。尝试将其声明为volatile,它告诉编译器此变量可能会“意外地”更改,例如来自其他线程或硬件中断。