私は、deadline_timer の期限が切れたときにハンドラーを呼び出す ios オブジェクトを実装しました。これは正しく行われていると確信しています。
プセド:
localScheduler(_localSchedulerIO)
_localSchedulerIO.poll()
while (1)
{
_localSchedulerIO.reset()
_localSchedulerIO.poll()
}
わかりました...これはi686で動作します。締め切りタイマーは 15 秒ごとに完了し、すべて順調です。
今、摩擦のために。組み込み環境でコンパイルして実行すると、最初にプログラムプロセスを開始すると、継続的な「準備完了」の run() ハンドラーが取得されます。これは望ましくありません。さらに奇妙な..プログラムを2回実行すると、期待どおりに動作します(15秒)! ハム..
boost::asio を 1 回実行することで満たすことができる依存関係を知っている人はいますか?
devファイルがありませんか?
詳細: 更新: time_traits 派生を使用すると、ここで役立ちますか?
Scheduler::Scheduler(ba::io_service& io) :
,timer_ (io, seconds(SCHEDULER_TIMER))
{
timer_.async_wait(boost::bind(&Scheduler::run, this, _1));
}
void Scheduler::run(const boost::system::error_code& error)
{
if (!error)
{
// DO SOMETHING
// reset timer -- now a run loop
timer_.expires_at(timer_.expires_at() + seconds(SCHEDULER_TIMER));
//timer_.expires_at((pt::second_clock::local_time() + seconds(SCHEDULER_TIMER)));
timer_.async_wait(boost::bind(&Scheduler::run, this, _1));
} // timer error
}
Class Scheduler
{
// timer run
protected:
ba::deadline_timer timer_;
}
// main process
MainProcess::MainProcess() :
, _localScheduler(_localSchedulerIO)
{
}
// scheduler asio
DefaultLogSink().Info("Starting Scheduler server\n");
_localSchedulerIO.run_one(); // blocks until first timer expiry
DefaultLogSink().Info("Scheduler server started\n");
while (1)
{
_localSchedulerIO.reset();
_localSchedulerIO.poll_one();
}