【发布时间】:2019-08-01 15:20:44
【问题描述】:
我正在使用 QTimer,但没有发出超时信号。
这是我的代码:
QTimer* receiveTimer = new QTimer();
receiveTimer->setInterval(1000);
connect(receiveTimer, SIGNAL(timeout()), this, SLOT(timeout()));
QByteArray res;
inWait = true;
receiveTimer->start();
qDebug() << "Before while";
while (!res.contains("OK\r\n") && inWait)
qDebug() << res.append(sPort->read(1));
qDebug() << "After while";
receiveTimer->stop();
一开始,我在类构造函数中定义了定时器,但也没有用。
【问题讨论】:
-
QTimer 仅在 Qt 事件循环运行时工作;当您的线程卡在您自己的
while()循环中时,它不能/不会工作,因为这会阻止 Qt 事件循环执行事件。在此处查看详细信息:stackoverflow.com/questions/42279360/… -
那么,我应该创建另一个线程并在那里启动计时器吗? @JeremyFriesner
-
不——你应该做的是不要尝试在 while() 循环中阻塞;不能很好地与 Qt 的事件驱动模型集成。即,如果您想在“一段时间后”停止您的 receiveTimer,请在
timeout()插槽内执行此操作,而不是尝试在您启动计时器的同一功能的底部执行此操作。 -
摆脱 while 循环。而是在可用时使用信号和插槽来处理数据。基本上这个函数需要在你的类中划分到不同的槽中。
-
您必须深入了解基于事件的应用程序架构的概念。你永远不会等待自己。框架(来自其事件循环的 Qt)将在发生某些事情时调用您的代码。你对它做出反应,也许设置稍后发生的事情(使用计时器,或者通过发送网络请求,或者通过启动外部进程,或者......),然后尽快返回,因为只要你的代码是正在运行,没有其他代码正在运行。如果你觉得这很困难,那就更努力地思考 :-) 在你真正掌握普通单线程 Qt 应用程序的架构之前忘记线程。