12

ブーストを使用して次の日曜日まで眠るにはどうすればよいですか? 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);
    // ...
}
4

2 に答える 2

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
}

Coliruでコンパイルするのを見てください(明らかにタイムアウトします)

于 2013-10-11T08:33:55.507 に答える
2

これは不安定に聞こえます。ユーザーがコンピューターの電源をオフにしたり、休止状態にしたり、単に再起動したりした場合はどうなりますか?

これは、次の 2 つの方法のいずれかで行います。

  1. スケジュールされたタスク (または windows/osx 用語が何であれ) / cronjob (linux) を追加し、日曜日に実行するように設定します。

  2. 自動起動に追加し、定期的に (10/30/60 分に 1 回) 日曜日かどうかを確認します。

どちらの方法でも、5 日間スリープするよりも、再起動/シャットダウン/休止状態を適切に処理できます。

于 2013-10-11T07:35:29.460 に答える