1

我正在尝试用 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()并打印出当前时间。此外,我当前的实现似乎让线程阻塞了应用程序的其余部分,这是我绝对不想要的。我将如何做这两件事?

在线程方面我是个菜鸟,所以如果我说了一些看起来不正确的话,请原谅我。

4

3 回答 3

2

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

  1. 确保你Start()在你之前调用Initialize()(使用相同的 io_service 实例),这样 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 回答