2011-10-31 130 views
0

今天早上在Qtimer身邊纏了一點麻煩。延遲QTimer開始?

這裏的基本思想是:

我有一個是通過點擊一個按鈕,啓動了一個QTimer。 一旦它被激活,每5分鐘它就會調用一個函數(我們稱之爲start())。

Start()使用QtConcurrent調用獨立函數(稱爲工作())。因此,儘管處理仍然存在,但它會很快返回。

這是我的問題: 我想一次接一次地調用work()幾次。我的問題是,目前,它會在完成處理之前多次調用work()函數,因爲它與硬件接口不起作用。

我應該如何正確處理?

編輯:

這裏是節目的基本流程:

  • 用戶點擊startTimer所()。
  • 開始時間()調用timer->開始()
  • 當計時器發出信號,它調用啓動()
  • 開始()不一些光UI東西,然後使確實 未來= QtConcurrent ::運行(... work()...)//工作需要很長時間 watcher-> setFuture(* future)
  • 不知何故(這是我的問題),當work()完成時,我想調用它再次(準確地說是4次)

回答

2

如果我理解正確,您的問題要避免運行work()函數同時在多個線程中。

work()函數頂部使用QMutexLocker,並將相應的QMutex添加到您的類定義中。

這種方式執行work()函數將被阻塞,直到前一次執行完成。

+0

嗯,聽起來不錯。但是,我應該如何檢查執行何時完成(然後再次立即調用work())? – hex4def6

+0

在工作函數開始時有一個mutexlocker後,只要work()完成,就會調用mutex。在執行期間,所有其他線程將在work()函數開始時被阻塞。自動解鎖互斥鎖後,第一個等待線程將鎖定它並開始執行。檢查[同步Qt線程以獲取更多詳細信息](http://doc.qt.nokia.com/latest/threads-synchronizing.html) – pnezis

+0

ohh,所以它比「拒絕執行」更像是「延遲執行」 – hex4def6

0

如果您的work()函數有一個異常,因爲某些原因需要20分鐘,您是否希望儘快運行4個下一個work()回調......或者仍然希望它們儘可能間隔5分鐘延時?

如果你想要的是真正的5分鐘間隔,那麼你應該使用單次計時器,每次完成一個工作項目時重新排隊。通過這種方式,你不必與QTimer消息的大堵塞隊列,可以淹沒並運行一次全部清盤的潛力:

http://doc.qt.io/qt-4.8/qtimer.html#singleShot-prop