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->exit()
之前不会退出。默认的 QThread 实现在其run()
方法中旋转一个事件循环。在您退出之前,此事件循环将一直处于活动状态。代码在等待超时时实际上会接收信号和事件——毕竟它是异步的:它会快速执行一些代码,然后在退出 timerSlot()
时返回到事件循环。以上是关于QTime 或 QTimer 等待超时的主要内容,如果未能解决你的问题,请参考以下文章