代码之家  ›  专栏  ›  技术社区  ›  elmt

C++螺纹秒表

  •  1
  • elmt  · 技术社区  · 14 年前

    我想在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 回复  |  直到 14 年前
        1
  •  2
  •   Nim    14 年前

    因为你正在创建一个新线程来处理 io_service::run()

    1. 确保你打电话 Start() 在你面前 Initialize() (使用相同的io U服务实例),这样io U服务就可以执行某些操作,否则它将退出!
    2. HandleTimer() 方法,调用 async_wait 再次排队等待下一个勾号,否则io U服务将退出,因为它与此无关。。
        2
  •  1
  •   Sam Miller    14 年前

    你读过Boost.Asio异步 deadline timer tutorial ? 加上 multiple threads 通过创建要调用的线程池 io_service::run .

    io_service::run()以设置 从中完成处理程序的线程 可能被调用。这种方法也可能 执行任何计算的方法 线程池中的任务。

    请注意,已连接的所有线程 相当于,io U服务可以 专横的时尚。

        3
  •  -2
  •   Jay    14 年前

    这对我有效:

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