在进行程序编写中,我们有时会有在子线程中使用定时器不间断运行并且将子线程产生的数据发送给主线程的需求,在实际的编写过程中可能会碰到QObject::startTimer: Timers cannot be started from another thread
的问题,本文将会介绍产生原因及解决方法。
1. 错误用法及原因
您可能会这么做: 子类化QThread,在线程类中定义一个定时器,然后在run()方法中调用定时器的start()方法。
接下来在主线程中创建该线程对象,并调用它的start()方法:
看似十分自然,没有什么不妥,然而,编译器将通知下面的错误信息:
QObject::startTimer: Timers cannot be started from another thread
——定时器不能被其它线程start。
我们来分析一下:
-
刚开始只有主线程一个,TestThread的实例是在主线程中创建的,定时器在TestThread的构造函数中,所以也是在主线程中创建的。
-
当调用TestThread的start()方法时,这时有两个线程。定时器的start()方法是在另一个线程中,也就是TestThread中调用的。
-
创建和调用并不是在同一线程中,所以出现了错误。
每个QObject实例都有一个叫做“线程关系”(thread affinity)的属性,或者说,它处