我在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_thinker
s的槽相连。当所有s 完成后,调用.finished()
ThinkerThread::subThinkerFinished()
_sub_thinker
_sub_thinker
ThinkerThread::subThinkerFinished()
quit()
还有一个地方quit()
叫:
void ThinkerThread::tryKill()
{
for (int i = 0; i < NSUBTHINKERS; i++)
_sub_thinker[i].tryKill();
quit();
}
从主线程,执行如下:
- thinker.tryKill() [注意:在第一次运行时,thinker 没有运行。]
- thinker.start()
thinker
的finished()
信号与 连接autoMove()
。
对于 Qt 的所有早期版本,在从autoMove()
调用之后thinker::quit()
调用ThinkerThread::subThinkerFinished()
。在 4.7 中,我看到它autoMove()
是在第一次调用 之后调用的thinker.tryKill()
,即使线程没有运行。
任何的想法?
当然,我可以检查内部ThinkerThread::tryKill()
是否thinker
正在运行。但我想知道为什么会这样。
谢谢。