首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread混淆

QThread混淆
EN

Stack Overflow用户
提问于 2010-12-21 14:57:53
回答 1查看 396关注 0票数 0

我正在使用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函数:

代码语言:javascript
复制
void ThinkerThread::run()
{
    _threads_running = NSUBTHINKERS;

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

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

    exec();
}

_sub_thinkerfinished()信号与所有_sub_thinkerThinkerThread::subThinkerFinished()插槽相连。当_sub_thinker全部完成时,ThinkerThread::subThinkerFinished()调用quit()

还有一个地方叫quit()

代码语言:javascript
复制
void ThinkerThread::tryKill()
{
    for (int i = 0; i < NSUBTHINKERS; i++)
        _sub_thinker[i].tryKill();
    quit();
}

从主线程中,执行如下:

  • thinker.tryKill()注:一开始,思想家不是running.
  • thinker.start()

thinkerfinished()信号与autoMove()相连。

对于所有以前版本的Qt,autoMove()是在thinker::quit()ThinkerThread::subThinkerFinished()调用之后调用的。在4.7中,我看到autoMove()是在thinker.tryKill()的第一次调用之后调用的,尽管线程没有运行。

有什么想法吗?

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-24 17:00:39

我发现每次调用QThread::finished()时都会发出QThread::quit(),而不管QThread的状态如何(即运行/不运行)。对于早期版本的Qt,情况并非如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4500558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档