我使用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();
如果我不改变系统时间,这适用于今天。但是,如果我尝试将其设置为tommorow(或将来的任何其他日期),并更改系统时间来测试它 - 它不会触发(它会在async_wait调用后计算几毫秒?)< / p>
除了时间池之外还有其他任何方法可以在给定的日期和时间(非时间间隔)内启动任务吗?
答案 0 :(得分:0)
您可以使用std::this_thread::sleep_until
。
根据description on cppreference.com,这将考虑后续的时钟调整:
阻止当前线程的执行,直到达到指定的sleep_time。
使用绑定到
sleep_time
的时钟,这意味着要考虑时钟的调整。因此,根据调整的方向,块的持续时间可能但可能不会在呼叫时小于或大于sleep_time - Clock::now()
。由于调度或资源争用延迟,该函数也可能阻塞的时间超过sleep_time
之后。
然而,这是C ++ 11的新功能。如果您的编译器不支持,您可能需要轮询。除非根据您的操作系统有其他库支持。此外,sleep_until
可能在内部使用轮询(或者如果时钟发生变化,它会巧妙地唤醒和重新配置)。
正如评论中所提到的,在Unix风格的系统(包括Mac OS X)或Windows上的任务计划程序中,通过cron
通过外部解决(按计划调用流程)更常见问题。当涉及到任务的潜在失败时,这种外部调用会更加健壮。