2012-04-01 241 views
1

我正在寫一個Qt應用程序,並且我有一個四小時循環(在一個單獨的線程中)。在這四個小時的循環中,我必須:QTime或QTimer等待超時

  1. 做的東西與串口;
  2. 等待一段固定的時間;
  3. 用串口做更多的東西;
  4. 等待一段任意的時間。
  5. 當500ms過去時,做更多的東西;
  6. 轉到1.並重復四個小時。

目前,我這樣做的方法非常糟糕,並導致一些計算機崩潰。我有一大堆代碼,但下面的代碼片段基本顯示了這個問題。 CPU達到〜100%,最終可能會導致計算機崩潰。

void CRelayduinoUserControl::wait(int timeMS) 
{ 
    int curTime = loopTimer->elapsed(); 
    while(loopTimer->elapsed() < curTime + timeMS); 
} 

我需要等待一段特定的時間才能繼續使用該程序。是否有一些功能會等待一段時間,同時保持所有定時器的運行?

+0

http://stackoverflow.com/questions/11996706/qt-c-wait-till-specific-time-to-execute-function/14144614#14144614 – formiaczek 2013-01-03 18:13:02

回答

1

如果您想在QT中入睡,請使用QTimer。只需將計時器的超時信號連接到包含您希望每x次執行的代碼的插槽即可。

+0

感謝回答。我知道sleep()函數;問題是當我睡覺時,定時器停止計數。 – 2012-04-01 05:36:03

+1

QTimer是你的計時器。爲什麼你需要保持一些其他的計時器運行? – teukkam 2012-04-02 06:15:41

+0

因爲我需要在一個單獨的線程中每隔500毫秒進行一次四個小時的操作。如果我睡覺,定時器停止... – 2012-04-03 13:48:21

0

IMO你應該使用信號/插槽機制,儘管在一段時間內等待。代碼可能是類似的東西:

#define STATE_1 0x01 
#define STATE_2 0x02 
#define STATE_3 0x03 
..... 
QTimer * timer = new QTimer(); 
connect(timer,SIGNAL(timeout()),SLOT(timerSlot())); 
int state = STATE_1 ; 
timer->timerSlot() 
.... 


void timerSlot() { 
    switch(state) { 
    case STATE_1: 
     // do stuff with the serial port 
     state = STATE_2; 
     timer->start(time_to_wait_in_ms); 
     break; 
    case STATE_2: 
     // do more stuff with the serial port 
     state = STATE_3; 
     timer->start(500); 
     break; 
    case STATE_3: 
     // do more stuff 
     state = STATE_1; 
     timer->start(1000*60*60*4); 
     break; 
    } 
+0

感謝您的回覆。雖然我有一些問題,我的計時器將運行在一個新的線程中,並且我不知道如何保持該線程等待沒有退出的信號。我正在考慮使用qEventLoop來解決這個問題。此外,您提供的代碼在等待4小時超時時,它實際上不會收到任何其他信號(如500毫秒超時)。 – 2012-04-03 13:46:18

+0

那麼,你可以很容易地修改它與另一個計時器等待500毫秒超時,而你在4小時的等待。 IMO是最簡單的方法,而不是使用另一個線程。 – Flynch 2012-04-03 13:50:13

+0

QThread的美妙之處在於它不會退出,直到你調用'thread-> exit()'。默認的QThread實現在其run()方法中旋轉事件循環。此事件循環在您退出之前一直處於活動狀態。代碼在等待超時時,實際上會接收到信號和事件 - 畢竟它是異步的:它快速執行一些代碼,然後在退出timerSlot()時返回到事件循環。 – 2012-06-01 18:39:28