2011-03-22 188 views
0

這裏開始是我如何使用QTimer:QTimer停止並自行

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

程序監視update()函數,並打印當前時間吧。通常情況下,它按預期工作,它每秒都會打印時間,但當程序開始處理其他作業時,會有一些休息時間,例如5到8秒。

Qt Documentation提到像1毫秒的準確度問題,顯然我有另一個問題。有任何想法嗎 ?

回答

2

QTimer(和所有基於事件的消息傳遞)不是中斷驅動的。這意味着您無法保證您在發送活動時會收到活動。準確性描述事件如何被觸發,而不是如何傳遞。

如果您在長時間工作中沒有進行線程化處理,請在長時間處理期間定期撥打QCoreApplication::processEvents()以確保您的槽被調用。

+0

我想你的意思是「QCoreApplication :: processEvents()」。 QTimer的所有者類是從QThread派生的。 「長期過程」主要是I/O,它由一個普通的班級擁有。然後參考你指出的文檔「調用這個函數只處理調用線程的事件」,我想我也需要從QThread派生我的I/O類。 – metdos 2011-03-22 17:24:51

+0

確實我的意思是processEvent。糟糕的C&P技能。 :)即使信號來自單獨的線程,您仍然應該調用它。這就是信號如何通過線程傳遞。同樣要小心,函數在哪裏(在哪個類中)與它將運行哪個線程無關。它由函數調用的線程決定。你可以在QThread中有一個成員函數,並從主線程調用它。它將在主線程中運行。反過來也是如此。在「普通」類中放置函數並不保證僅從主線程調用該函數。 – 2011-03-22 17:55:32

0

您的其他作業運行幾秒鐘,並且在這些過程中沒有事件處理。你需要線程才能獲得你想要的響應。