gpt4 book ai didi

QThread 不会停止/不处理信号

转载 作者:行者123 更新时间:2023-12-04 13:58:22 26 4
gpt4 key购买 nike

我试图在一个单独的线程中执行一些工作,并在工作完成后停止该线程。

我已经建立了这样的连接

thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );

但是当我发出 finished() 信号时,quit() 槽永远不会被调用。命令行不显示任何与失败连接相关的警告。

我创建了一个简单的测试项目来缩小问题的范围,我得到了相同的行为:

测试类.h:

#ifndef TESTCLASS_H
#define TESTCLASS_H
class TestClass : public QObject
{
Q_OBJECT
public:
TestClass() { }
signals:
void finished();
public slots:
void doWork();
}
#endif // TESTCLASS_H

测试类.cpp:

#include "TestClass.h"
#include <QtCore/QDebug>
void TestClass::doWork()
{
qDebug() << "Starting";
for( long i = 0; i < 1000000000; i++ );
qDebug() << "Done";
emit finished();
};

和 main.cpp:

#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include "TestClass.h"

int main( int argc, char* argv[] )
{
QCoreApplication a( argc, argv );

TestClass testClass;
QThread testThread;

testClass.moveToThread( &testThread );

testThread.connect( &testClass, SIGNAL( finished() ), SLOT( quit() ) );
testClass.connect( &testThread, SIGNAL( started() ), SLOT( doWork() ) );

testThread.start();
testThread.wait();

return 0;
}

所以这是我期望发生的事情:
  • 曾经testThread.start()得到处理,线程的 run()函数被调用,内部调用 exec()并启动一个事件循环。此外,它会抛出一个 started()信号。
  • testClass有它的 doWork()插槽调用。
  • TestClass::doWork()完成后,它会抛出 finished()信号。
  • testThread的事件循环接收信号并将其转发到其 quit()插槽
  • testThread.wait()当线程结束时从等待中返回。

  • 步骤 1-3 工作,我得到 qDebug()输出。
    问题出在第 4 步:信号被触发并转发到某个事件循环(我调试了一下,但无法确定它被触发到哪个事件循环)但是 quit()插槽永远不会被调用。

    我究竟做错了什么?

    P.S.:请不要建议子类化 QThread,我尝试这种方式的全部目的是因为我想避免子类化 QThread。

    最佳答案

    我相信问题在于您实际上没有在场景中运行 Qt 事件循环。如果更换 testThread.wait()a.exec() (启动 Qt 事件循环)您应该看到您的信号/插槽得到正确处理。

    如果您希望应用程序在线程完成后退出,您可以使用 QCoreApplication 的 quit()插槽这样做。

    关于QThread 不会停止/不处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432861/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com