QTime или QTimer ждут тайм-аут - PullRequest
1 голос
/ 01 апреля 2012

Я пишу приложение Qt, и у меня есть четырехчасовой цикл (в отдельном потоке).В этом четырехчасовом цикле я должен:

  1. делать вещи с последовательным портом;
  2. ждать фиксированный период времени;
  3. делать еще кое-что споследовательный порт;
  4. ждать произвольное количество времени.
  5. по прошествии 500 мсек делать больше вещей;
  6. Перейти к 1. и повторить в течение четырех часов.

В настоящее время мой способ сделать это очень плох, и некоторые компьютеры зависают.У меня есть целая куча кода, но следующий фрагмент в основном показывает проблему.Процессор уходит на ~ 100% и в конечном итоге может привести к сбою компьютера.

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

Мне нужно как-то подождать некоторое время, прежде чем продолжить работу с программой.Есть ли какая-нибудь функция, которая будет просто ждать некоторый произвольный период времени, сохраняя при этом все таймеры?

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Если вы хотите спать в QT, используйте QTimer .Просто подключите сигнал тайм-аута от таймера к слоту, который содержит код, который вы хотите делать каждый раз.

0 голосов
/ 02 апреля 2012

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; 
  }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...