Qt之QTimer与多线程

本文探讨了在Qt中如何正确使用QThread与QTimer的组合。介绍了两种创建线程和定时器的方式,强调了在子线程中创建QTimer的重要性,以及信号与槽在跨线程通信中的作用。详细阐述了如何确保QTimer以及其他子对象运行在期望的线程中,提出了最佳实践,以避免线程相关的问题。

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

http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/

书籍推荐方式
1、子类化QObject,假设为xObj。
2、子类化QThread,在构造函数中new xObj(),然后再connect相关信号-槽。
3、在QObject子类xObj的构造函数中,创建定时器QTimer,假设为xTimer。再connect相关信号-槽。
4、运行时,xTimer的信号与槽(均在xObj中定义)能正常通信。
5、如果在子类化QThread时,new xObj()不在构造函数中创建对象,而是在run中创建,那么第4步则不能正常通信。这是定时器的特殊情况,如果不用定时器,而是普通信号-槽处理,则此步无影响,在构造函数或者run创建都行。

个人推荐方式
1、子类化QObject,假设为xObj。包括所有信号、槽,定时器等。其中所有需要轮询处理的流程,通过定时器来处理。
2、创建QThread对象xThread,通过xObj->moveToThread将xObj挂到新建的xThread上,即可。
3、特别注意:xObj对定时器等的创建不能在构造函数中创建,否则创建出来的对象的线程是主线程。需要将其放在某个函数(如start ),然后线程(或者 外部程序)通过信号-槽来调用创建。

暂时先记录流程,后续再细化,并补上代码。

2020.01.04记录:
今日发现之前对于子线程和QTimer之类对象的关系又加深一点,记录如下。
1、类中会有各种方法,其中槽最为特殊,槽与信号相响应。当类对象挂在子线程上时,如何让类对象的所有子对象也运行在子线程中,就是个最为要紧的问题,其中槽就可以用来处理该类问题。
2、类对象挂至子线程时,并非就这么理所当然地,类对象中的子对象一定就是运行在子线程。比如,当主线程直接去调用类对象的槽或者其它方法,而槽(或者方法)又正好创建了个QTimer,那么这个QTimer的父线程就是主线程了,而非子线程。。。划重点:类对象的槽(或者方法)在哪个线程调用,其中创建的子对象的父线程均为这个调用的线程,而不是类对象所挂到的线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值