我正在使用QT4.7.0 (32位)在Windows 7终极(32位)机器上。我一直在使用Qt,可能来自4.0或4.2版本,我几乎使用了所有的4.x.y版本。
最近,QT4.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的finished()信号与所有_sub_thinker的ThinkerThread::subThinkerFinished()插槽相连。当_sub_thinker全部完成时,ThinkerThread::subThinkerFinished()调用quit()。
还有一个地方叫quit():
void ThinkerThread::tryKill()
{
for (int i = 0; i < NSUBTHINKERS; i++)
_sub_thinker[i].tryKill();
quit();
}从主线程中,执行如下:
thinker的finished()信号与autoMove()相连。
对于所有以前版本的Qt,autoMove()是在thinker::quit()从ThinkerThread::subThinkerFinished()调用之后调用的。在4.7中,我看到autoMove()是在thinker.tryKill()的第一次调用之后调用的,尽管线程没有运行。
有什么想法吗?
当然,我可以在ThinkerThread::tryKill()内部检查thinker是否正在运行。但我想知道为什么会这样。
谢谢。
发布于 2010-12-24 17:00:39
我发现每次调用QThread::finished()时都会发出QThread::quit(),而不管QThread的状态如何(即运行/不运行)。对于早期版本的Qt,情况并非如此。
https://stackoverflow.com/questions/4500558
复制相似问题