【问题标题】:C++ Threaded StopwatchC++ 线程秒表
【发布时间】:2011-05-05 07:11:22
【问题描述】:

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

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

【问题讨论】:

    标签: c++ boost boost-thread stopwatch


    【解决方案1】:

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

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

    【讨论】:

    • 您的第二点是那些令人耳目一新的时刻之一。但现在效果很好。谢谢。
    • :) 太棒了,整个事件的安排很难掌握,我也花了一段时间......
    【解决方案2】:

    你读过Boost.Asio异步deadline timer tutorial吗?通过创建线程池来调用io_service::run 来添加multiple threads 相当简单。

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

    请注意,所有已加入的线程 考虑 io_service 的池 等效,并且 io_service 可能 在他们之间分配工作 任意时尚。

    【讨论】:

      【解决方案3】:

      这对我有用:

      #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 );
      }
      

      【讨论】:

      • 我正在寻找一个带螺纹的秒表,这样我就可以一直打电话给Tick。这个实现并没有真正帮助我。
      • 这是标记为 C++。 static 在任何情况下都不是线程安全的。期待反对票。
      • 如果您只需要对操作进行计时(“秒表”),从每个指标来看,这都是一个更好的解决方案。如果你想模仿 TimerTask 那么它不是秒表。请原谅我试图提出更好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2013-05-04
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多