如何使用助推器在下周日睡觉?我可以将boost::gregorian::date
对象转换为boost::this_thread::sleep_until
可以处理的对象吗?有可能吗?
#include <boost/date_time.hpp>
int main()
{
boost::gregorian::date current_date(boost::gregorian::day_clock::local_day());
boost::gregorian::greg_weekday next_sunday_date(boost::gregorian::Sunday);
boost::gregorian::date next_weekday_date = next_weekday(current_date, next_sunday_date);
// ...
}
答案 0 :(得分:8)
这就是我想出来的。
请注意,我使代码通常更具可读性。这一点非常重要,不仅仅是为了将来的维护,还因为它可以让你“看到森林中的树木” - 这反过来又让你在精神上记住了重要的概念。
至少,这有助于我。
编辑 DyP提供了一种使用sleep_until
的方法(在极少数情况下会更准确,例如在睡眠期间时钟会发生变化)。
#include <boost/date_time.hpp>
#include <boost/date_time/time_clock.hpp>
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
using namespace boost::gregorian;
using boost::posix_time::ptime;
using clock = boost::posix_time::microsec_clock; // or: boost::posix_time::second_clock;
auto today = date(day_clock::local_day());
auto at_sunday = greg_weekday(Sunday);
auto next_sunday = next_weekday(today, at_sunday);
#if 1
auto as_tm = to_tm(next_sunday);
auto as_time_t = mktime(&as_tm);
auto as_time_point = std::chrono::system_clock::from_time_t(as_time_t);
std::this_thread::sleep_until(as_time_point);
#else
auto duration = (ptime(next_sunday) - clock::local_time());
auto msecs = duration.total_milliseconds();
std::cout << msecs << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(msecs));
#endif
}
查看 compiling on Coliru (显然超时)
答案 1 :(得分:2)
听起来不稳定。如果用户关闭计算机或进入休眠状态,或者只是重新启动该怎么办?
我会用以下两种方式之一来做这件事:
添加计划任务(或任何windows / osx术语)/ cronjob(linux)并将其设置为在星期日运行。
将其添加到自动启动中并定期(每10/30/60分钟一次)检查是否是星期天。
两种方式都比休眠5天更好地处理重启/关闭/休眠。