QTime 或 QTimer 等待超时

Posted

技术标签:

【中文标题】QTime 或 QTimer 等待超时【英文标题】:QTime or QTimer wait for timeout 【发布时间】:2012-04-01 04:17:15 【问题描述】:

我正在编写一个 Qt 应用程序,我有一个四小时的循环(在一个单独的线程中)。在这四个小时的循环中,我必须:

    用串口做事; 等待一段固定的时间; 用串口做更多的事情; 等待任意时间。 当 500 毫秒过去时,做更多的事情; 转到 1. 并重复四个小时。

目前,我这样做的方法非常糟糕,并且导致一些计算机崩溃。我有一大堆代码,但下面的sn-p基本上说明了问题。 CPU 达到 ~100%,最终可能导致计算机崩溃。

 void CRelayduinoUserControl::wait(int timeMS)

    int curTime = loopTimer->elapsed();
    while(loopTimer->elapsed() < curTime + timeMS);

我需要等待一段特定的时间才能继续执行该程序。是否有一些函数会在保持所有计时器运行的同时等待任意时间段?

【问题讨论】:

***.com/questions/11996706/… 【参考方案1】:

如果你想在 QT 中睡觉,请使用QTimer。只需将定时器的超时信号连接到包含您想要每隔 x 时间执行的代码的插槽即可。

【讨论】:

感谢您的回答。我知道 sleep() 函数;问题是当我睡觉时,计时器停止计数。 QTimer 是你的计时器。为什么需要让其他计时器保持运行? 因为我需要在一个单独的线程中每 500 毫秒做一些事情,持续四个小时。如果我睡着了,计时器就会停止……【参考方案2】:

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; 
    

【讨论】:

感谢您的回复。我有几个问题;我的计时器将在一个新线程中运行,我不知道如何让该线程等待信号而不退出。我正在考虑使用 qEventLoop 来解决这个问题。此外,您提供的代码在等待 4 小时超时时,实际上不会收到任何其他信号(如 500 毫秒超时)。 好吧,您可以轻松地使用另一个 Timer 修改它,以便在等待 4 小时时等待 500 毫秒超时。 IMO 是最简单的方法,而不是使用另一个线程。 QThread 的美妙之处在于它在您调用thread-&gt;exit() 之前不会退出。默认的 QThread 实现在其run() 方法中旋转一个事件循环。在您退出之前,此事件循环将一直处于活动状态。代码在等待超时时实际上会接收信号和事件——毕竟它是异步的:它会快速执行一些代码,然后在退出 timerSlot() 时返回到事件循环。

以上是关于QTime 或 QTimer 等待超时的主要内容,如果未能解决你的问题,请参考以下文章

Qt之等待提示框(QTimer)

电子时钟QTimeQTimerQLCDNumber

QTimer 超时信号不发出

QTimer 不触发(触发)超时

当 singleShot 为 True 时,QTimer 永远不会触发超时 [关闭]

2.6.4 Qtimer定时器介绍