【问题标题】:Qt C++ Run code every secondQt C++ 每秒运行代码
【发布时间】:2019-09-27 17:40:47
【问题描述】:

我需要每秒检查一次条件,然后运行函数。执行是异步的,所以不会有任何问题。我可以在循环中的某个地方调用函数吗?自程序开始以来,我会花时间检查是否第二次通过。我在哪里可以找到主循环?谢谢

【问题讨论】:

标签: c++ qt


【解决方案1】:

使用 QTimer 可以解决这个问题:

QTimer* timer = new QTimer();
timer->setInterval(1000); //Time in milliseconds
//timer->setSingleShot(false); //Setting this to true makes the timer run only once
connect(timer, &QTimer::timeout, this, [=](){
    //Do your stuff in here, gets called every interval time
});
timer->start(); //Call start() AFTER connect
//Do not call start(0) since this will change interval

此外(并且由于 lambda 函数对目标对象生命周期的不安全性存在争论)当然可以将其连接到另一个对象中的插槽:

connect(timer, &QTimer::timeout, anotherObjectPtr, &AnotherObject::method);

请注意,这个方法不应该有参数,因为超时信号也是没有参数定义的。

【讨论】:

  • 哇!这是完美的!没有想到这么简单的解决方案。从昨天开始使用 qt,它是一个野兽!
  • 对此要非常小心,不要推荐给新手!将 lambdas 与 QObject::connect() 一起使用并不是一个没有问题的玩具!目标对象被销毁时不会自动断开连接。参考这个:wiki.qt.io/New_Signal_Slot_Syntax
  • @TheQuantumPhysicist 因为有this 作为上下文,所以它会很好地断开连接。
  • 还有一个问题 - [=] 是什么意思?我可以用 functionName() 改变它吗?
  • @SebastianSzczepański 我编辑了答案以反映连接到另一个对象的第二种可能性,当然也可以是this
猜你喜欢
  • 2018-10-29
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多