QObject::startTimer: timers cannot be started from another thread 一则输出调试:关于QT的线程关联性


开始

今天在调试输出里看见QObject::startTimer: timers cannot be started from another thread 

QTimer类

 从Qt的帮助文档里可以得到他的使用方法。

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);

 

更多的可以查阅官方帮助,本文是一次多线程的错误使用的记录

QTimer类在多线程中的使用

一次错误的示例

在线程类中定义定时器,然后在run()中调用定时器。

于是输出会提醒你->QObject::startTimer: timers cannot be started from another thread 

--------------------------------------------定时器不能在另一个线程里被启用。

 

首先,每一个QObject实例中,接受信号或者事件时,槽函数或者事件处理器将在对象所处的线程中执行。

然后,这个定时器是在线程类的构造函数中,我们在主进程中实例创建了一个对象,所以定时器是在主进程中的,而start()在线程中调用,所以会报错。

 

另一些正确的使用

 

  1.  在TestThread线程启动后创建定时器
    • 线程在主进程中实例化,他的子对象也需要在主进程里创建,不能指定定时器的父对象为子线程。
    • 要使用事件循环exec(),否则线程会立即结束,并发出finished()信号。
    • stop()也需要在线程中调用。
  2. 在主进程中创建,然后使用moveToThread()方法改变定时器所处的线程,不要给定时器设置父类,否则该函数将不会生效。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM