2012-04-01 3 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 시간 동안 500ms마다 아무 것도해야하기 때문에. 잠을 자면 타이머가 멈 춥니 다. –

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 시간 대기 중에 500ms 타임 아웃을 기다린다. IMO는 다른 스레드를 사용하는 것이 아니라 가장 간단한 방법입니다. – Flynch

+0

QThread의 장점은'thread-> exit()'를 호출 할 때까지 종료되지 않는다는 것입니다. 기본 QThread 구현은'run()'메소드에서 이벤트 루프를 돌립니다. 이 이벤트 루프는 종료 할 때까지 활성화됩니다. 코드는 타임 아웃을 기다리고있을 때 실제로 시그널과 이벤트를받습니다. 결국 비동기식입니다. 코드의 일부를 빠르게 실행 한 다음 'timerSlot()'이 종료되면 이벤트 루프로 돌아갑니다. –

관련 문제