首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在创建worker QObject时QThread对象没有finished信号?

在创建worker QObject时,QThread对象没有finished信号的原因是因为QThread并不是一个真正的线程,它只是一个线程控制类。在Qt中,QThread的作用是为QObject提供一个事件循环,并将其移动到新的线程中执行。因此,当创建一个worker QObject并将其移动到QThread中时,并不会触发QThread的finished信号。

具体来说,当我们创建一个QThread对象并调用其start()方法时,QThread会在内部创建一个新的系统线程,并在该线程中执行一个事件循环。然后,我们可以通过调用worker QObject的moveToThread()方法将其移动到这个新的线程中,使其在新线程中执行。

然而,由于QThread并不是一个真正的线程,它只是一个线程控制类,因此它并没有与线程结束相关的信号。相反,我们可以通过在worker QObject中自定义一个信号来表示工作的完成,然后在工作完成时手动发射这个信号。

例如,我们可以在worker QObject中定义一个finished信号,并在工作完成时手动发射它:

代码语言:txt
复制
class Worker : public QObject
{
    Q_OBJECT

public:
    Worker() {}

public slots:
    void doWork()
    {
        // 执行工作任务
        // ...

        // 工作完成后发射finished信号
        emit finished();
    }

signals:
    void finished();
};

然后,在创建worker QObject并将其移动到QThread中时,我们可以连接worker的finished信号到其他槽函数,以便在工作完成时执行相应的操作:

代码语言:txt
复制
QThread* thread = new QThread;
Worker* worker = new Worker;

// 将worker移动到新线程中
worker->moveToThread(thread);

// 连接worker的finished信号到其他槽函数
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));

// 启动线程
thread->start();

// 执行工作任务
QMetaObject::invokeMethod(worker, "doWork");

通过这种方式,我们可以在worker QObject中自定义一个信号来表示工作的完成,从而实现类似于finished信号的功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

QThread

注意:跨不同线程与对象交互必须小心。有关详细信息,请参见同步线程。...从Qt4.8起,通过将finished()信号连接到QObject::deleteLater(),可以释放位于刚刚结束的线程中的对象。   ...删除正在运行的QThread(即isFinished()返回false)将导致程序崩溃。删除QThread之前,等待finished()信号。...---- [signal] void QThread::finished()   该信号完成执行之前从关联线程中发出。     发出此信号,事件循环已停止运行。...只有当没有为该线程安装事件调度器,才可以执行此操作。 也就是说,使用start()启动线程之前,或者主线程的情况下,实例化QCoreApplication之前。 此方法获取对象的所有权。

2.6K20

Qt多线程1:QThread

: new ThreadFromQThread(NULL);并没有给他指定父对象 connect(thread,&QThread::finished ,thread,&QObject::deleteLater...再线程运行完成,发射finished信号后会调用deleteLater函数,确认消息循环中没有这个线程的对象后会销毁。...::destroyed信号,在线程对象析构通知UI把m_currentRunLoaclThread设置为nullptr; 2.5 继承QThread的一些总结 QThread只有run函数是新线程里的...,而是通过deleteLater槽进行安全的销毁,因此,继承QObject多线程的方法创建时有几个槽函数需要特别关注: 一个是QThreadfinished信号对接QObject的deleteLater...创建多线程的方法如下: 写一个继承QObject的类,对需要进行复杂耗时逻辑的入口函数声明为槽函数 此类旧线程new出来,不能给它设置任何父对象 同时声明一个QThread对象官方例子里,QThread

2.7K41

【Qt】Qt的线程(两种QThread类的详细使用方式)「建议收藏」

使用QtConcurrent创建的程序会根据进程数自行调整使用的线程数。 QThread类 简述 QThread类提供了与系统无关的线程。 QThread代表程序中一个单独的线程控制。...线程可以代码执行的任何点被终止。线程可能在更新数据被终止,从而没有机会来清理自己,解锁等等。。。总之,只有绝对必要使用此函数。...定义一个继承于QObjectworker类,worker类中定义一个槽slot函数doWork(),这个函数中定义线程需要做的工作; 在要使用线程的controller类中,新建一个QThread...的对象和woker类对象,使用moveToThread()方法将worker对象的事件循环全部交由QThread对象处理; 建立相关的信号函数和槽函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作...SLOT(doWork(int))); //operate信号发射后启动线程工作 connect(&workerThread, &QThread::finished, worker

3K21

Qt高并发

2)QObject::moveToThread()可将其移动到另一个线程 moveToThread(this) 由于QThread是一个QObject而且需要额外的线程才会创建QThread,...这就意味着,当信号连接到这个QThread的槽上,槽函数的执行是在其创建线程,而不是在其管理的线程进行的。...QObject是可重入的,但有必要记住它的三个约束条件: 1、QObject的子对象必须在它的父对象线程中创建 特别需要说明的是,这一约束条件意味着在次线程中创建对象永远不能将QThread...对象作为创建它们的父对象,因为QThread对象另外一个线程(主线程或者·另外一个不同的次线程)中创建的。...2、删除对应的QThread对象之前,必须删除所有在次线程中创建QObject对象 通过QThread::run()中的堆栈上创建这些对象,就可以完成这一点。

1.4K20

qt多线程编程实例_lgbt

当线程启动和结束QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。...QApplication前创建对象QObject::thread()返回NULL,意味着主线程仅为这些对象处理投递事件,不会为没有所属线程的对象处理另外的事件。...另一个线程(而不是创建它的线程)中delete QObject对象是不安全的。除非可以保证同一对象不在处理事件。...QThread主要信号如下: void started();线程开始运行时发送信号 void finished();线程完成运行时发送信号 void terminated();线程被异常终止发送信号...例如:一个线程中创建了一个QTimer对象,但从没有调用exec(),那么,QTimer就永远不会发射timeout()信号,即使调用deleteLater()也不行。

1.4K10

正确使用Qt多线程

QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事件队列(每一个线程都有一个属于自己的事件队列)中的事件。...QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事件队列(每一个线程都有一个属于自己的事件队列)中的事件。...QThread t; QTimer timer; Worker worker; QObject::connect(&timer, SIGNAL(timeout()),...在这个例子中,信号由主线程的QTimer对象发出,之后Qt会将关联的事件放到worker所属线程的事件队列。由于队列连接的作用,不同线程间连接信号和槽是很安全的。...2)直接连接(DirectConnection),当信号发射,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行。

1.3K11

QThread 的使用「建议收藏」

方式一:子类化QThread,并重新实现 run() 函数 方式二:定义工作对象继承自 QObject,然后把这个工作对象move到QThread的一个对象中。 3....,则等同于直接连接 如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接 也就是这说,只存在下面两种情况(直接连接和队列连接) 直接连接(Direct Connection) 当信号发射,槽函数将直接被调用...无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。 队列连接(Queued Connection) 当控制权回到接受者所依附线程的事件循环,槽函数被调用。...除非:QThread 对象依附到次线程中(通过movetoThread) slot 和信号是直接连接,且信号在次线程中发射 槽函数呢,其实就可以当成普通函数来使用。...,但却被它所创建的子线程调用。

60720

QThread介绍

实现一个自定义QThread的步骤如下: ①新创建类TestThread继承QThread ②重写run方法 ③定义TestThread对象并调用该对象的start方法运行 TestThread.h代码如下...widget.cpp中线程对象创建信号与槽的绑定、线程启动代码如下: TestThread *thread = new TestThread(this); connect(thread...运行效果: [2]QThread信号事件 QThread有两个信号事件,一个是线程开始(run函数被调用之前发出此信号),发出来的,一个是线程结束(在线程将要结束发出此信号)。...开始和结束信号如下: void finished() void started() [3]QThread执行完后自动释放内存 QThread执行结束后自动释放内存,是利用finished...()),thread,SLOT(deleteLater())); thread->start(); 其中,信号的发送者和接收者都是新创建的thread对象,槽函数为deleteLater(),

1K20

Qt使用多线程的一些心得——1.继承QThread的多线程使用方法

//全局线程创建可以把窗体指针作为父对象 m_thread = new ThreadFromQThread(this); //关联线程的信号和槽 connect(m_thread...,因此在窗体创建创建线程,可以把线程的父对象设置为窗体,这时需要注意,别手动delete线程指针。...还有一种方法是让QThread自己删除自己,就是new线程,不指定父对象,通过绑定**void QObject::deleteLater () [slot]**槽让它自动释放。...: new ThreadFromQThread(NULL);并没有给他指定父对象 connect(thread,&QThread::finished ,thread,&QObject::deleteLater...再线程运行完成,发射finished信号后会调用deleteLater函数,确认消息循环中没有这个线程的对象后会销毁。

2.8K11

【QT】解决继承QThread的子线程导致程序无法关闭&主线程关闭太快导致子线程中的槽方法未执行

发现程序卡死,于是想是不是没有开启事件循环?尝试子线程run函数中开启后,依然无效,难道说,其实这个对象是属于主线程?...就是因为run函数中的while(open_flag)没有被更改为false从而终止循环。 为什么没被更改? 因为我们的信号对应的槽函数没有被执行?...为什么没被执行? 因为使用参数Qt::QueuedConnection被放到了主线程的事件队列中,等待当前代码执行完毕之后被执行. 解决方式 该发送信号后手动调用事件处理。...阻塞线程,直到满足以下任一条件: 与此QThread对象关联的线程已完成执行(即,当它从run()返回)。如果线程已完成,此函数将返回true。如果线程还没有启动,它也会返回true。...补充 总结发现,调试的时候也可以通过检测这个finished信号,看时间循环什么时候关闭的。

77310

QT学习之如何使用QThread(继承QThread)

只有运行在 run 函数的代码,才新的线程中 2. 如果别的线程和 run 函数中,同时操作线程对象(如 consumer)的成员变量,这个时候就要做线程同步,为其做加锁等操作! 二....先创建一个生产者,简单的加一个生产完成信号 #ifndef PRODUCER_H #define PRODUCER_H #include class Producer : public...再创建一个消费者线程,继承 QThread 类, 在线程中实现消费 头文件中,声明 run 函数 以及接受来自生产者的槽函数 #ifndef CONSUMER_H #define CONSUMER_H...结果 从上面可以看出: 该继承于 QThread 类的对象,只有run()运行在新的线程中,其他函数是主线程中运行,因此这个时候如果对象的成员变量,同时两个线程中被操作,就要考虑线程同步的问题了...就算是用信号发送的方式,Qthread对象 的槽函数也是运行于旧的线程

1.1K40

qtcpsocket断开_2020-05-06 QT子线程使用QTcpSocket连接服务器

为什么要是用多线程? 多线程的使用主要是为了处理比较耗时的过程。...多线程的实现可以通过两种方式实现 分别是:1.继承QThread实现多线程2.继承QObject实现多线程(由于继承QObject的多线程实现方法更加灵活,Qt官方推荐使用该方法实现多线程)。...这里将采用第二种方式实现多线程 多线程实现过程 1.创建一个继承于QObject的自定义线程类,用来处理比较耗时的功能。...(QString)//用来向主线程发送链接成功信息 void signal_back(QString)//用来向主线程发送从服务器获取的数据 2.主线程中创建一个子线程 QThread *mThread...= new QThread(this); 3.创建一个自定义线程对象 TcpSocketThread *mTcpSocketThread = new TcpSocketThread (); 注意:这里创建对象不能指定父对象

1.5K30

python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

()退出之后线程就基本结束了,QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束之时执行一段代码进行资源的初始化和释放操作,更灵活的使用方法是,自定义的...QThread实例中自定义信号,并将信号连接到指定的槽函数,当满足一定的业务条件发射此信号 QThread类中的常用方法 方法 描述 start() 启动线程 wait() 阻止线程,直到满足如下条件之一...函数之前,从相关线程发射此信号 finished 当程序完成业务逻辑,从相关线程发射此信号 QThread的使用方法实例 import sys from PyQt5.QtWidgets import...__init__(parent) #设置标题 self.setWindowTitle('QThread多线程例子') #实例化多线程对象 self.thread = Worker...长时间停留在此界面,知道多线程任务完成后,此界面才会动,当耗时程序非常大,就会造成程序运行失败的假象,实际还是在后台运行的,只是没有显示主窗口的界面上,当然用户体验也就非常差,那么如何解决这个问题呢

7.9K35

07 线程学习

: #include qmake: QT += core Inherits: QObject //继承于QObject 从官方文档可以看出,如果一个线程类要支持信号和槽,那么,该类要直接或者间接的继承于...QObject类,并且类中要声明宏:Q_OBJECT 2.1 线程的创建 线程的创建方式:自定义一个类继承于QThread,并且 重写该类的run函数,run函数中,就是 子线程要执行任务。...,子线程中,不是必须使用,除非,要使用信号和槽来跟其他线程通信 线程实现的步骤: 第一步:创建一个子类继承于QThread,并且重写run函数 第二步:创建子线程对象 第三步:启动子线程 ----...//发一条通知给UI线程(UI控件) class MyThread : public QThread { Q_OBJECT //该类中,可以支持信号和槽,另外,该类还要间接或者直接继承于QObject...线程同步:多个线程之间处理数据,按照一 定次序来进行完成,比如: 数据接收 — 数据处理 — 数据发送,把这个过程称之为线程同步。

14320
领券