2012-04-01 1 views
1

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

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

В настоящее время мой способ сделать это очень плохой, и сбой некоторых компьютеров. У меня есть целая куча кода, но следующий фрагмент в основном показывает проблему. Процессор переходит на уровень ~ 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. Просто подключите сигнал тайм-аута от таймера к слоту, который содержит код, который вы хотите делать каждые х раз.

+0

Благодарность за ответ. Я знаю о функции sleep(); проблема в том, что когда я сплю, таймеры перестают считать. –

+1

QTimer - ваш таймер. Зачем вам нужен другой таймер? – teukkam

+0

Потому что мне нужно что-то делать каждые 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-часового тайм-аута, на самом деле не получит никаких других сигналов (например, тайм-аут 500 мс). –

+0

Ну, вы можете легко изменить его с помощью другого таймера, чтобы подождать 500 мс таймаута, пока вы находитесь в ожидании 4h. ИМО - самый простой подход, а не другой поток. – Flynch

+0

Красота QThread заключается в том, что она не выйдет, пока вы не назовете 'thread-> exit()'. По умолчанию реализация QThread запускает цикл событий в методе 'run()'. Этот цикл событий будет активен, пока вы не выйдете из него. Код, когда он ожидает тайм-аута, фактически получит сигналы и события - он асинхронный, в конце концов: он быстро выполняет бит своего кода и возвращается в цикл событий, когда он выходит из 'timerSlot()'. –

Смежные вопросы