1

JavaのTimerTaskに似たストップウォッチをC++で作成しようとしています。すでにスレッドが組み込まれているので、彼らのライブラリが好きです。BoostChronoを見たことがありますがまだ開発中であり、使用したくないと考えています。

私の現在の実装は運が悪かった(私は今メモリを使っているので、これは少し疑似コードのようかもしれない)。

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


Initialize()
{
  boost::shared_ptr<boost::thread> thread = boost::shared_ptr<boost::thread>(
      new boost::thread(
        boost::bind(&boost::asio::io_service::run, &io)
  );
}

Start()
{
   timer.async_wait(
       bind(&HandleTimerEvent, this, asio::placeholders::error)
   );
}

Stop()
{
  timer.cancel
}

Tick()
{
   cout << "THE TIME IS: " << timer.current_time << endl; // Pseudo code for current_time.
}

HandleTimerEvent(boost::system::error_code& e)
{
  cout << "Timer has ended: " << e << endl;
}

私が欲しいのは、スレッドに継続的に呼び出しTick()て現在の時刻を出力させることです。また、私の現在の実装には、アプリケーションの残りの部分をブロックするスレッドがあるようです。これは、私が絶対に望んでいないことです。これらの両方をどのように行うのでしょうか?

私は糸脱毛に関しては初心者なので、正しくないと思われることを言った場合はご容赦ください。

4

3 に答える 3

2

処理する新しいスレッドを作成しているためio_service::run()、メインスレッドはブロックされません。あなたがしなければならない2つのこと、

  1. Start()(同じ io_service インスタンスを使用して)前に必ず呼び出してくださいInitialize()。このようにして、io_service が実行する何かがあり、そうでなければ終了します!
  2. HandleTimer()メソッドで、次のティックをキューに入れるために再度呼び出しますasync_wait。そうしないと、io_service は何もしないので終了します。
于 2010-11-04T21:15:28.430 に答える
1

Boost.Asio 非同期期限タイマー チュートリアルを読みましたか? 呼び出すスレッド プールを作成して、複数のスレッドを追加するのは簡単io_service::runです。

複数のスレッドが io_service::run() を呼び出して、完了ハンドラを呼び出すことができるスレッドのプールを設定することができます。このアプローチは、io_service::post() で使用して、スレッドプール全体で計算タスクを実行する手段を使用することもできます。

io_service のプールに参加したすべてのスレッドは同等であると見なされ、io_service は任意の方法で作業をスレッド間で分散できることに注意してください。

于 2010-11-04T21:09:47.627 に答える
-2

これは私のために働く:

#include <sys/time.h>

static struct timeval tv_s, tv_e;

static void timer_start()
{
   gettimeofday( &tv_s, NULL );
}

static unsigned long timer_stop()
{
   gettimeofday( &tv_e, NULL );
   return (tv_e.tv_sec - tv_s.tv_sec ) * 1000000ul
      + ( tv_e.tv_usec - tv_s.tv_usec );
}
于 2010-11-04T20:43:03.573 に答える