boost ::datetimeを使用してC++でタイムアウトwhileループを実装するにはどうすればよいですか?
何かのようなもの:
#define TIMEOUT 12
while(some_boost_datetime_expression(TIMEOUT))
{
do_something(); // do it until timeout expires
}
// timeout expired
タイムアウトにはBoost::deadline_timerを使用します。ループ内の値を常にチェックすることは、CPUにとってやり過ぎです。
最初に開始時刻をマークしてから、現在の時刻と開始時刻の差を計算する必要があります。組み込みのブースト日時式は、説明したとおりに機能しません。ブースト日時の用語: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サイトでドキュメントとサンプルコードを読んでいるだけです。)
時差を確認するだけです。
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
}
しかし、そのようなことをする代わりに、あなたはあなたのデザインを再考するかもしれません。
これは、 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;
}