2011-06-06 118 views
6

我遵循Qt SDK中的示例,在QThread子類 中啓動定時器,但我不斷收到警告,並且線程從不啓動計時器。 下面是代碼:QT線程:獲取QObject :: startTimer:定時器不能從另一個線程啓動警告

NotificationThread::NotificationThread(QObject *parent) 
      :QThread(parent), 
      m_timerInterval(0) 
{ 
moveToThread(this); 
} 


NotificationThread::~NotificationThread() 
{ 
; 
} 

void NotificationThread::fire() 
{ 
    WRITELOG("A::fire called -- currentThread:" + QString::number((int)currentThread()->currentThreadId())); 
    QVector<StringPer>* batchVectorResult = new QVector<StringPer>(); 
    emit UpdateGroupNotifications(batchVectorResult); 

} 

void NotificationThread::run() 
{ 

     connect(&m_NotificationTimer, SIGNAL(timeout()), 
       this,SLOT(fire(),Qt::DirectConnection)); 

     WRITELOG("A::run() worker thread -- currentThread:" + QString::number((int)currentThread()->currentThreadId())); 
    //SetNotificationTimerFromConf(); 
    QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD)); 
    int interval = val.toInt(); 
    m_NotificationTimer.setInterval(interval); 
     m_NotificationTimer.start(); 

     QThread::exec(); 
} 


void NotificationThread::SetNotificationTimerFromConf() 
{ 
QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD)); 
int interval = val.toInt(); 
m_NotificationTimer.setInterval(interval); 
} 


void NotificationThread::UpdateNotificationTimerRT(int timerInterval) 
{ 
m_NotificationTimer.setInterval(m_timerInterval); 
} 


void NotificationThread::Execute(const QStringList batchReqList) 
{ 
QVector<QString>* batchVectorResult = new QVector<QString>(); 
start(); 
} 

我從Execute()主GUI啓動線程。

回答

7

創建run()計時器如果添加行

m_NotificationTimer.moveToThread(this); 

開頭run()你的線程從你的定時器對象的那一點開始的方法將調用你線程中的連接槽。

當您第一次創建計時器時,它將在您的主線程中運行。通過將其移動到您自己的線程中,moveToThread方法將更改計時器對象的線程關聯性。

10

問題是,當您創建線程對象時,主線程會隱式創建計時器。這是因爲你的計時器是你的線程類的成員。

當您嘗試啓動計時器時,您在另一個線程(在run())中執行,而不是在創建計時器的線程中,這會給出警告。

您需要在要運行它的線程中創建計時器:從

QTimer m_NotificationTimer; 

變化m_notificationTimer聲明在NotificcationThread

QTimer* m_NotificationTimer; 

m_NotificationTimer = new QTimer(this); 
m_NotificationTimer->setInterval(interval); 
m_NotificationTimer->start(); 
+0

或者只是使用一個初始化列表: MyClass類:公共QObject的 { Q_OBJECT 市民: MyClass的():m_thread(本){} QTimer m_timer; } – nocnokneo 2016-10-10 15:54:23

2

還值得一提的這個article

最大的調整對我來說是要明白,在QT線被用作一個接口,而不是真正用於子類。據說,我會保持你的類和實際的QThread分開。然後,只需使用YourClass.moveToThread(& YourQtThread)來確保您的信號和插槽在該線程上處理。

+0

鏈接到文章轉移到http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/ – hcc23 2013-02-28 15:49:28

+0

感謝您的信息。我更新了鏈接 – Aki 2013-02-28 16:10:40