0

boost ::datetimeを使用してC++でタイムアウトwhileループを実装するにはどうすればよいですか?

何かのようなもの:

#define TIMEOUT 12

while(some_boost_datetime_expression(TIMEOUT))
{
    do_something(); // do it until timeout expires
}

// timeout expired
4

4 に答える 4

2

タイムアウトにはBoost::deadline_timerを使用します。ループ内の値を常にチェックすることは、CPUにとってやり過ぎです。

于 2012-10-29T14:35:50.617 に答える
1

最初に開始時刻をマークしてから、現在の時刻と開始時刻の差を計算する必要があります。組み込みのブースト日時式は、説明したとおりに機能しません。ブースト日時の用語:http ://www.boost.org/doc/libs/1_51_0/doc/html/date_time.htmlタイムアウトの期間は「期間」であり、開始するポイントは「時点」です。 "。

1秒以内の精度が必要で、4分2秒の間隔があるとします。

using namespace boost::posix_time;
ptime start = second_clock::local_time();

タイミングを開始する時点を提供します

ptime end = start + minutes(4)+seconds(2);

今から4分2秒後の時点を示します。

その後

( second_clock::local_time() < end )

現在の時刻が終了時刻より前である場合にのみtrueになります。

(免責事項:これは、以前にブースト日時コードを実際に記述したことに基づいているのではなく、ブーストWebサイトでドキュメントとサンプルコードを読んでいるだけです。)

于 2012-10-29T14:41:18.603 に答える
1

時差を確認するだけです。

boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
while((boost::posix_time::microsec_clock::local_time() - now) < boost::posix_time::milliseconds(TIMEOUT ) )
{
    // do something
}

しかし、そのようなことをする代わりに、あなたはあなたのデザインを再考するかもしれません。

于 2012-10-29T14:42:03.673 に答える
0

これは、 boost.Asioを使用して簡単に実行できます。1つの非同期プロセスとしてdeadline_timerを開始します。有効期限が切れると、イベントループがキャンセルされます。実行されるまで、同じイベントループに作業を投稿し続けます。実用的なソリューション:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class timed_job
{
    public:
        timed_job( int timeout ) :
            timer_( io_service_, boost::posix_time::seconds( timeout ) )  // Deadline timer
        {
        }

        void start()
        {  

            // Start timer
            timer_.async_wait
                (
                 boost::bind
                 (
                  &timed_job::stop, this
                 )
                );

            // Post your work
            io_service_.post
                (
                 boost::bind
                 (
                  &timed_job::do_work, this
                 )
                );

            io_service_.run();
            std::cout << "stopped." << std::endl;
        }

    private:
        void stop()
        {  
            std::cout << "call stop..." << std::endl;
            io_service_.stop();
        }

        void do_work ()
        {  
            std::cout << "running..." << std::endl;

            // Keep posting the work.
            io_service_.post
                (
                 boost::bind
                 (
                  &timed_job::do_work, this
                 )
                );
        }

    private:
        boost::asio::io_service io_service_;
        boost::asio::deadline_timer timer_;
};

int main()
{
    timed_job job( 5 );
    job.start();

    return 0;
}
于 2012-10-30T06:06:57.353 に答える