Qt自总结(一) QThread

本文深入探讨Qt线程实现方式与信号槽交互原理,包括直接继承QThread、QueuedConnection、直连线程间信号触发及工作对象方式等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        该总结源自对Qt官方文档的理解。
        有两种方式,一种是类似Java的Thread类的方式使用,即继承QThread,然后override父类的run方法,然后start开启线程,这种方法适合没有信号槽交互,就当作普通的线程来执行,像pthread。因为信号槽需要事件循环,父类中的run里面会调用exec开启新的事件循环,如果override了父类的run方法,当然就没有事件循环了,除非自己调exec,但是不知道父类的run里面调exec前还是否做了什么准备工作,所以自己调exec还是不太安全,不推荐。
        如果槽写在QThread的派生类里,则有以下几种情况:
        1. connect是在创建该线程对象的类里执行的,QueuedConnection,不管在哪发信,槽都是在老线程里执行的。
        2. connect是在创建该线程对象的类里执行的,直连,在新线程中发信,槽是在新线程里执行的。
        3. connect是在新线程中执行的,直连,在新线程中发信,则槽是在新线程里执行的。
        4. connect是在新线程中执行的,QueuedConnection在新线程中发信,则槽是在老线程里执行的。
        这个是非主流方法,不再赘述。

        如果想要槽在新线程中执行,最好是用官方推荐的work-object方式。很简单,代码如下:
        QThread t;
        QObject o;
        o->movetothread(&t);
        connect();
        t.start();
        这个o对象的槽可以连接任何信号(any signal, from any object)。
        最后要说的是deleteLater,这个被调用后,等程序回到执行该函数所在线程的事件循环,相应的对象才会被delete。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值