QThread混乱

时间:2010-12-21 14:57:54

标签: c++ multithreading qt qthread

我在 Windows 7旗舰版(32位)计算机上使用 Qt 4.7.0(32位)。我一直在使用Qt版本4.0或4.2,我几乎使用了所有 4.x.y 版本。

最近,在Qt 4.7中我遇到了麻烦。

我在一些旧版本的Qt中编写了一个多线程应用程序。我忘记了版本,但可能是我编译和正确运行的最后一个版本是4.5.x或4.6.x. 线程部分似乎在4.7中没有正常工作,或者我误解了一些东西。这是问题所在:

主线程启动thinker线程。以下是run()线程的thinker函数:

void ThinkerThread::run()
{
    _threads_running = NSUBTHINKERS;

    // ...
    _sub_thinker[0].start();

    // ...    
    _sub_thinker[1].start();

    exec();
}

_sub_thinker的{​​{1}}信号与所有finished()的{​​{1}}广告连接。完成所有ThinkerThread::subThinkerFinished()后,_sub_thinker会调用_sub_thinker

还有另一个地方叫ThinkerThread::subThinkerFinished()

quit()

从主线程开始,执行如下:

  • thinker.tryKill()[注意:非常拳头,思想家没有跑步。]
  • thinker.start()

quit()的{​​{1}}信号与void ThinkerThread::tryKill() { for (int i = 0; i < NSUBTHINKERS; i++) _sub_thinker[i].tryKill(); quit(); } 相关联。

对于所有以前版本的Qt,thinkerfinished()调用autoMove()后被调用。在4.7中我看到autoMove()在第一次调用thinker::quit()之后被调用,即使线程没有运行。

有什么想法吗?

当然,如果ThinkerThread::subThinkerFinished()正在运行,我可以在autoMove()内查看。但我想知道为什么会这样。

感谢。

1 个答案:

答案 0 :(得分:0)

我发现每次调用QThread::finished()时都会发出QThread::quit(),无论QThread的状态如何(即运行/未运行)。对于先前版本的Qt,情况并非如此。