2012-04-01 7 views
1

私はQtアプリケーションを書いていますが、私は別のスレッドで4時間のループを持っています。その4時間のループでは、私は:QTimeまたはQTimerがタイムアウトを待つ

  1. シリアルポートでものをする;
  2. 一定の時間待機します。
  3. シリアルポートでもう少しのことをしてください。
  4. 任意の時間待機します。
  5. 500msを過ぎると、さらに処理が行われます。
  6. 1.に移動し、4時間繰り返します。

現在のところ、私のやり方は非常に悪く、一部のコンピュータがクラッシュします。私はたくさんのコードを持っていますが、次のスニペットは基本的に問題を示しています。 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

答えて

1

QTで寝る場合は、QTimerを使用してください。タイマーからのタイムアウト信号を、x時間ごとに実行したいコードが入っているスロットに接続するだけです。

+0

をありがとう回答。私はsleep()関数について知っています。問題は、私が眠っているときに、タイマーが数えなくなることです。 –

+1

QTimerはあなたのタイマーです。他のタイマーを稼働させ続ける必要があるのはなぜですか? – teukkam

+0

私は別々のスレッドで4時間500ミリ秒ごとに何かする必要があるので。私が眠ったら、タイマーは止まる... –

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時間のタイムアウトを待っている間は、(500msのタイムアウトのような)他の信号を実際に受け取ることはありません。 –

+0

4時間待機中に500 msのタイムアウトを待つように、別のタイマーで簡単に変更できます。 IMOは、別のスレッドを使用するのではなく、最も簡単なアプローチです。 – Flynch

+0

QThreadの美しさは、 'thread-> exit()'を呼び出すまで終了しないということです。デフォルトのQThread実装は 'run()'メソッドでイベントループをスピンします。このイベントループは、終了するまでアクティブになります。タイムアウトを待っているコードは、実際にはシグナルとイベントを受け取ります。非同期です。コードの一部が素早く実行され、 'timerSlot()'が終了するとイベントループに戻ります。 –

関連する問題