首页
学习
活动
专区
工具
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信号的功能。

相关搜索:为什么Awesomplete JavaScript对象在新建时无法创建?有没有办法在创建对象时将其删除?如何知道在创建对象时是否没有传入参数?虚幻引擎:为什么在创建Actor时使用子对象?为什么我的对象在我创建它、保存它并想要警告它时没有警告?在创建新对象时没有传入任何值,如何使用默认参数?在pandas中创建子图时,"AttributeError:'list‘对象没有'unstack’属性“为什么在执行Java Stream终端操作时,对象没有被垃圾回收?有没有办法在创建用户对象时发送用户电子邮件?有没有办法避免在django中引用页面时创建新对象?元组: SQLAlchemy:‘AttributeError’对象在创建关联表时没有'foreign_keys‘属性为什么当我在控制台记录对象时,其他两个对象属性没有出现?在EKS中使用ALB入口控制器时,为什么没有创建target?在Ruby on Rails中创建对象时,您更喜欢哪种保存方法,为什么?为什么在ngOnInit中创建时,angular会说我的对象可以为空?为什么在启动spring boot microservce时,Liquibase没有在postgres中创建我的表?AttributeError:在keras中创建模型时,“Tensor”对象没有“”_keras_shape“”属性为什么我们在selenium中创建驱动程序对象时要进行类型转换?在成功创建HTTP Post记录时,我没有从请求中收到新创建的记录值。为什么?为什么在ASP.NET中创建新控制器时没有"Api Controller - Empty“选项?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

QThread类

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

2.7K20

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多线程的方法在创建时有几个槽函数需要特别关注: 一个是QThread的finished信号对接QObject的deleteLater...创建多线程的方法如下: 写一个继承QObject的类,对需要进行复杂耗时逻辑的入口函数声明为槽函数 此类在旧线程new出来,不能给它设置任何父对象 同时声明一个QThread对象,在官方例子里,QThread

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

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

    10K22

    Qt高并发

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

    1.5K20

    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.5K10

    正确使用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.4K11

    QThread 的使用「建议收藏」

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

    1.5K20

    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(),

    1.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函数,在确认消息循环中没有这个线程的对象后会销毁。

    3.2K11

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

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

    1K10

    如何在 PyQt 中启动“绘图循环”?

    1、问题背景在GUI编程中,我们经常需要让GUI根据程序中不断变化的数据进行更新。在程序启动时,我们可能已经根据初始数据绘制了GUI。...2、解决方案一种有效的方法是将核心程序运行在一个QThread中,并使用信号与GUI进行通信。下面是一个示例,演示如何使用QThread和信号在主程序执行某些操作时更新进度对话框。...class Library(QtCore.QObject): def __init__(self): QtCore.QObject....() self.ui_progress.show() self.ui_progress.raise_()​ # 创建添加文件线程对象 self.add_files_thread...,我们可以使用以下代码来启动绘图循环:# 创建一个 Library 对象library = Library()​# 将 URL 列表传递给 Library 对象library.importUrls(url_list

    8110

    30道Qt面试题(答案公布)

    什么是信号与槽机制?如何使用信号与槽实现对象间通信?信号与槽是Qt的核心机制,用于实现对象间的通信。信号是类发出的消息,槽是类的成员函数。当信号被触发时,连接到该信号的槽会被调用。...使用方法如下:connect(sender, &Sender::signal, receiver, &Receiver::slot);其中,sender是发出信号的对象,receiver是接收信号的对象...如何使用QThread创建多线程?可以通过继承QThread或使用QObject::moveToThread来创建多线程。...继承QThread的方式:class Worker : public QThread { Q_OBJECTprotected: void run() override {...线程间通信通常通过信号与槽机制实现。例如:connect(worker, &Worker::signal, receiver, &Receiver::slot);✦ 7.

    15600
    领券