【发布时间】:2014-11-13 14:54:10
【问题描述】:
我最近在使用 QTimer 时偶然发现了这个,它调用了一个带有内部 QEventLoop 的函数
所以,假设我们有一个 QTimer 实例
QTimer* timer = new QTimer;
我们在构造函数的某个地方启动它,它每 100 毫秒开始计时一次
timer->start(100);
现在是有趣的部分,我们将它连接到具有内部 QEventLoop 的插槽
void SlotFunction()
{
qDebug() << "entered";
QEventLoop loop;
loop.exec();
}
撇开这个循环有多愚蠢,我们看到我们永远不会完成对槽的处理,并且计时器的后续超时将继续堆积到执行队列中。一切都很好,应该是这样。
接下来是什么:因为 QEventLoop 确保我们的应用程序保持响应,而插槽无意识地闲置,我们可以制作一个按钮及其 clicked() 插槽,如下所示:
void OnClicked()
{
timer->start(100);
}
我在这里所做的基本上是重新启动当前的计时器周期,仅此而已。正确的?没有!重启后,SlotFunction 再次触发,表明计时器重启后的滴答声实际上并不等于在它之前发出的所有其他滴答声...
我唯一的问题是:WTF?! 为什么手动重新启动计时器使其能够进入插槽额外时间?我在freenode上问过,但我得到的唯一答案是“应该是这样”
【问题讨论】:
标签: qt qtimer qeventloop