【问题标题】:C++ run function in given date and timeC++ 在给定日期和时间运行函数
【发布时间】:2016-05-28 20:12:24
【问题描述】:

我使用 C++、QT 和 boost 编写了一些服务。

我需要在给定时间内运行一些功能(出于维护目的)。

我按预期工作的唯一方法是在线程中汇集当前时间。

我尝试过使用 boost 方法:

boost::asio::io_service io_service;
boost::asio::deadline_timer timer (io_service);
boost::gregorian::date day = boost::gregorian::day_clock::local_day();
boost::posix_time::time_duration time = boost::posix_time::duration_from_string(START_TIME);
boost::posix_time::ptime expirationtime ( day, time );
timer.expires_at (expirationtime);
timer.async_wait (boost::bind(func, param1, param2));
io_service.run();

如果我不更改系统时间,这适用于今天。但是,例如,如果我尝试将其设置为明天(或未来的任何其他日子),并更改系统时间来测试它 - 它不会触发(它在 async_wait 调用后计算毫秒数?)

除了时间池之外还有其他方法可以在给定的日期和时间(不是时间间隔)开始任务吗?

【问题讨论】:

  • 为什么不从操作系统做呢?如果您在 unix/linux 世界中,您可以使用 cron 来安排工作 - 参见例如aplawrence.com/BDD/bbcronbasics.htmlwindows 也应该有一些方法。
  • @Marinos K, 1. 该服务是多平台的。 2.函数使用了很多来自服务代码的特殊函数和类,不能简单的作为外部脚本运行。
  • 在这种情况下,对我来说唯一明显的解决方案是定期从系统查询时间(使用一些外部命令 - 例如 POSIX 中的 date 或适当的函数)。这可能意味着您将不得不依赖依赖于平台的标头,但这并没有太多的工作要做。
  • @Marinos K,正如我之前所写的那样-现在以这种方式工作-我将当前时间汇集在线程中。我只是想知道是否还有其他更“漂亮”的方法。
  • 虽然不是一个合适的解决方案,但我认为在触发时使用一些短间隔计时器和轮询时间而不是线程中的轮询时间要好得多。顺便说一句,你试过 QTimer 吗?

标签: c++ boost time scheduler


【解决方案1】:

您可以使用std::this_thread::sleep_until,而不是定期轮询。

根据description on cppreference.com,这将考虑到后续时钟调整:

阻塞当前线程的执行,直到达到指定的 sleep_time。

使用绑定到sleep_time 的时钟,这意味着时钟的调整被考虑在内。因此,在调用时,块的持续时间可能会(但可能不会)小于或大于sleep_time - Clock::now(),具体取决于调整的方向。由于调度或资源争用延迟,该函数也可能阻塞更长时间,直到达到sleep_time

但是,这是从 C++11 开始的新功能。如果您的编译器不支持,您可能需要轮询。除非根据您的操作系统有其他库支持。另外,sleep_until可能在内部使用轮询(或者如果时钟发生变化,它会巧妙地唤醒并重新配置)。

如 cmets 中所述,您的问题通常通过 Unix 风格系统(包括 Mac OS X)上的 cron 或 Windows 上的任务计划程序在外部解决(按计划调用您的进程)。当涉及到您的任务的潜在失败时,此类外部调用更加健壮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多