0

我在Windows 7 Ultimate(32 位)机器上使用Qt 4.7.0(32 位)。我可能从 4.0 或 4.2 版本开始使用 Qt,并且几乎使用了所有4.xy版本。

最近,使用 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_thinkers的槽相连。当所有s 完成后,调用.finished()ThinkerThread::subThinkerFinished()_sub_thinker_sub_thinkerThinkerThread::subThinkerFinished()quit()

还有一个地方quit()叫:

void ThinkerThread::tryKill()
{
    for (int i = 0; i < NSUBTHINKERS; i++)
        _sub_thinker[i].tryKill();
    quit();
}

从主线程,执行如下:

  • thinker.tryKill() [注意:在第一次运行时,thinker 没有运行。]
  • thinker.start()

thinkerfinished()信号与 连接autoMove()

对于 Qt 的所有早期版本,在从autoMove()调用之后thinker::quit()调用ThinkerThread::subThinkerFinished()。在 4.7 中,我看到它autoMove()是在第一次调用 之后调用的thinker.tryKill(),即使线程没有运行。

任何的想法?

当然,我可以检查内部ThinkerThread::tryKill()是否thinker正在运行。但我想知道为什么会这样。

谢谢。

4

1 回答 1

0

我发现QThread::finished()每次QThread::quit()调用都会发出,而与QThread(即运行/未运行)的状态无关。以前版本的 Qt 并非如此。

于 2010-12-24T17:00:39.367 回答