1

ここで見つけることができる時限コールバックには、ブーストから提案されたソリューションを使用しています。他のメソッドと並行して時限コールバックを実行するために使用しています。しかし、コールバックを設定した後にループを実行すると、コールバックが停止します。

//this is the main cpp file

void print(const boost::system::error_code& /*e*/)
{
  std::cout << "Hello, world!\n";
}

int main(int argc, char** argv)
{
        boost::asio::io_service io;
        boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
        t.async_wait(print);
        io.run();

        ....some part later I then call a function with while(){} loop inside....
        eng.Loopfunction();

Loopfunction() が呼び出された後、時限コールバックは機能しなくなります。この問題を克服する方法を知っていますか?

ありがとう。

4

1 に答える 1

1

時限コールバックが機能しなくなりました

呼び出されるのは一度だけですか?

コードによると:

  1. io.run()メインスレッドをブロックします
  2. print一度呼び出される
  3. io.run()メインスレッドのブロックを解除します
  4. eng.Loopfunctionと呼ばれる

それがどのように機能する必要があります。deadline_timer一度だけ呼び出されることに注意してください。毎秒タイマーを呼び出す場合は、次のようdeadline_timer::async_waitに最後に呼び出す必要があります。print

boost::asio::io_service io;
deadline_timer t(io);

void print(const boost::system::error_code& /*e*/)
{
  std::cout << "Hello, world!\n";

  // call this function again in 1 second
  t.expires_from_now( boost::posix_time::seconds(1) );
  t.async_wait(print);
}

int main(int argc, char** argv)
{
    t.expires_from_now( boost::posix_time::seconds(1) );
    t.async_wait(print);
    io.run();
于 2013-11-06T09:20:32.277 に答える