【问题标题】:QTimer long timeoutQTimer 长超时
【发布时间】:2017-08-06 23:25:27
【问题描述】:

Windows 10 64 位上的 Qt 5.7 32 位 长周期定时器

QTimer 的时间间隔以毫秒为有符号整数,因此可以设置的最大时间间隔略大于 24 天 (2^31 / (1000*3600*24) = 24.85) 我需要一个间隔远远超过这个限制的计时器。 所以我的问题是,您推荐哪种替代方案? std::chrono (C++11) 似乎不适合,因为它没有事件处理程序?

阿兰

【问题讨论】:

  • 使用任务调度程序 API。这将解决在计时器触发之前重新启动计算机的问题。

标签: c++ qt c++11


【解决方案1】:

您始终可以创建自己的类,该类在有效期间使用多个 QTimer,并且只计算已过去的数量。

很简单的问题。如果你只能数到 10 而你需要数到 100 - 只需数到 10 十次。

【讨论】:

  • 是的,这就是我同时实现的。如果延迟大于 2^31 -1,我使用该值启动计时器,然后在计时器事件循环中控制现在是否是所需的闹钟时间,如果不是,我递归地重新启动计时器,直到获得所需的时间。
【解决方案2】:

我将通过以下方式实现:

在计时器启动时,请注意当前时间(以毫秒为单位),如下所示:

m_timerStartTime = QDateTime::currentMSecsSinceEpoch()

我会在某个较大的时间间隔(例如 10 小时)启动一个计时器,然后将一个处理函数附加到计时器,该函数只是比较自开始以来的时间,看看我们是否到期:

 if(QDateTime::currentMSecsSinceEpoch() - m_timerStartTime > WANTED_DELAY_TIME){
      // Execute the timer payload
      // Stop interval timer
 }

这种简单的方法可以通过多种方式进行改进。例如,要在应用程序停止/重新启动时保持计时器运行,只需将计时器启动时间保存在 setting 或其他持久性存储中,并在应用程序启动时重新读取。

为了提高精度,只需在最后一次迭代中更改计时器处理函数的间隔,以便它完美地跟踪初始结束时间(而不是超过 10 分钟)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多