【发布时间】: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 吗?