開始
今天在調試輸出里看見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()在線程中調用,所以會報錯。
另一些正確的使用
- 在TestThread線程啟動后創建定時器
- 線程在主進程中實例化,他的子對象也需要在主進程里創建,不能指定定時器的父對象為子線程。
- 要使用事件循環exec(),否則線程會立即結束,並發出finished()信號。
- stop()也需要在線程中調用。
- 在主進程中創建,然后使用moveToThread()方法改變定時器所處的線程,不要給定時器設置父類,否則該函數將不會生效。