2

我需要创建一个计时器,它会定期(例如每 50 毫秒)调用我的函数。但问题是我需要在计时器运行时更​​改系统时间。我想使用 boost 来做到这一点,以便代码是可移植的。否则我在 Linux 机器上运行它。

我尝试过的事情:

  • 尝试使用 while 循环和 thread::sleep。使用 stable_clock 计算睡眠时间。
  • 也尝试使用deadline_timer

当系统时间调整时,这两个都停止工作。

问题:有没有办法(最好使用 boost)来创建一个独立于系统时间的回调计时器?(示例代码的奖励业力)

4

1 回答 1

3

好像是linux下的bug。您需要使用一种使用CLOCK_MONOTONIC( boost::this_thread::sleepuses CLOCK_REALTIME) 的睡眠方法。boost::this_thread::sleep_for使用 boost chrono 库应该这样做,因为它使用单调时钟。

while (true) {
    // Call your function here.
    boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}

或者,您可以使用boost::this_thread::sleep_until. 使用该功能,您可以使用自定义时钟。

但底层证券CLOCK_MONOTONIC可能会受到影响adjtime()。因此,您可以将CLOCK_MONOTONIC_RAW其用作 linux 唯一的替代方案。

另一种可能性:如果您能够使用 C++11,您可以使用它std::chrono::steady_clock来获得严格的单调时钟。

auto start = std::chrono::steady_clock::now();
while (true) {
    std::cout << (start - std::chrono::steady_clock::now()).count() << std::endl;
}

如果系统时钟得到调整,这里的输出不会改变。但不要将此与boost::this_thread. 使用它std::this_thread::sleep_for可以获得正确的结果。

最后一种可能性就是使用usleepor nanosleep

但请注意,您将无法使用最后两个选项(STL 和操作系统特定调用)中断睡眠。

于 2014-07-04T11:32:30.737 回答