gpt4 book ai didi

C++ 在给定的日期和时间运行函数

转载 作者:太空狗 更新时间:2023-10-29 23:14:09 26 4
gpt4 key购买 nike

我已经使用 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 调用后计算毫秒数?)

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

最佳答案

您可以使用 std::this_thread::sleep_until 代替定期轮询。

根据description on cppreference.com这将考虑随后的时钟调整:

Blocks the execution of the current thread until specified sleep_time has been reached.

The clock tied to sleep_time is used, which means that adjustments of the clock are taken into account. Thus, the duration of the block might, but might not, be less or more than sleep_time - Clock::now() at the time of the call, depending on the direction of the adjustment. The function also may block for longer than until after sleep_time has been reached due to scheduling or resource contention delays.

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

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

关于C++ 在给定的日期和时间运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com