【问题标题】:QThread::finished() is never emitted?QThread::finished() 永远不会发出?
【发布时间】:2012-10-18 02:29:50
【问题描述】:

我没有永远循环like this question,但它仍然没有发出finished() 信号,

在类的构造函数中:

connect (&thread, SIGNAL(started()), SLOT(threadFunc()));
connect (&thread, SIGNAL(finished()), SLOT(finished()));

在finished()函数中,

void XX::finished()
{
  qDebug() << "Completed";
}

void XX::threadFunc()
{
  qDebug() << "Thread finished"; // only single line, finishes immediately
}

但是我从来没有看到finished()被调用,每次在我用thread.start()启动线程之前,我必须手动调用thread.terminate(),我误解了QThread的用法吗?

【问题讨论】:

    标签: multithreading qt4


    【解决方案1】:

    QThread 将在 QThread::run 方法完成时发出 finished 信号。也许,您对此的实现不正确。

    run 方法的默认实现如下所示。它只是调用另一个exec 方法。

    void QThread::run()
    {
        (void) exec();
    }
    

    exec 方法的实现有点复杂。现在我把它简化了。

    int QThread::exec()
    {
        // .....
    
        if (d->exited) {
            return d->returnCode;   
        }
    
        // ......
    
        QEventLoop eventLoop;
        int returnCode = eventLoop.exec();
        return returnCode;
    }
    

    从代码来看,它可以在两种情况下完成。在第一种情况下,如果它已经退出。第二个它进入事件循环并等待直到exit()被调用。

    我们现在可以看到,你的无限线程循环就在这里。所以你需要QThread::quit() 等于QThread::exit(0)

    P.S. 不要使用terminate。很危险。

    【讨论】:

    • @warl0ck 所以这意味着你的线程有默认实现并等待exit,正如我上面所说的。
    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2013-05-08
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多