C ++螺纹秒表

时间:2010-11-04 20:23:30

标签: c++ boost boost-thread stopwatch

我正在尝试用C ++创建一个秒表,类似于Java的TimerTask。我喜欢他们的库,因为它已经内置了线程。我已经看到了Boost Chrono,但它仍在开发中,并且不想使用它。

我当前的实现一直没有运气(我现在正在通过内存,所以这可能是一个小伪代码)。

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()并打印出当前时间。此外,我当前的实现似乎有线程阻止应用程序的其余部分,这是我绝对不想要的。我怎么做这两件事?

当涉及到线程时,我是一个菜鸟所以请原谅我,如果我说的话似乎不对。

3 个答案:

答案 0 :(得分:2)

你几乎拥有它,因为你正在创建一个新的线程来处理io_service::run(),你的主线程不会阻塞。你需要做的两件事,

  1. 确保在Start()之前调用Initialize()(使用相同的io_service实例),这样io_service就可以做了,否则它会退出!
  2. 在您的HandleTimer()方法上,再次拨打async_wait以排队下一个节拍,否则io_service将退出,因为它无事可做..

答案 1 :(得分:1)

您是否阅读过Boost.Asio异步deadline timer tutorial?通过创建一个线程池来调用io_service::run来添加multiple threads是相当简单的。

  

多个线程可能会调用   io_service :: run()来建立一个池   完成处理程序的线程   可以被调用。这种方法也可能   与io_service :: post()一起使用   一种执行任何计算的方法   跨线程池的任务。

     

请注意已加入的所有线程   考虑一个io_service的池   等价的,io_service可以   在他们中间分配工作   任意时尚。

答案 2 :(得分:-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 );
}