我最近在使用调用具有内部 QEventLoop 的函数的 QTimer 时偶然发现了这一点
所以,假设我们有一个 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上问过,但我得到的唯一答案是“它应该是”