Qt之QTimer与多线程

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的父线程就是主线程了,而非子线程。。。划重点:类对象的槽(或者方法)在哪个线程调用,其中创建的子对象的父线程均为这个调用的线程,而不是类对象所挂到的线程。
3、然后,信号与槽之间的通信是可跨线程的,也就是说,当主线程发出一个信号,子线程的类对象对应的槽正好与之绑定了,那么这个类对象的槽中所创建的子对象的父线程,均为子线程。。。这里是不是很好理解,因为槽是在类对象内部调用的,所以槽中所创建子对象的父线程就应该是子线程的。
4、有了以上理解,那么实施步骤就是这样,创建类对象,子线程,将类对象挂至子线程,再将主线程的信号与类对象的槽绑定,将类对象需要创建的子对象(需要运行在子线程,如QTimer)都放在槽中。。这样,用主线程的信号,去触发子线程的类对象去创建这些子对象,即可。这个基本上是以前所做版本的最大优化了。

你可能感兴趣的:(sofeware,note)