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