2012-04-01 240 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