2010-11-04 52 views
1

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

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

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

当谈到线程时,我是一个小菜,所以请原谅我,如果我说了一些看起来不正确的东西。

回答

2

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

  1. 确保您在Initialize()之前调用Start()(使用相同的io_service对象实例),这种方式也有一些是io_service对象做,否则将退出!
  2. 在您HandleTimer()方法,再打电话async_wait排队的下一个节拍,否则io_service对象将退出,因为它没有任何关系..
+0

你的第二点是那些打耳光的时刻之一。但现在它效果很好。谢谢。 – elmt 2010-11-06 00:36:20

+0

:)很酷,事件的整体安排很难处理,花了我一段时间... – Nim 2010-11-06 00:59:05

-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); 
} 
+0

我找螺纹秒表这样我就可以一直叫'Tick' 。这个实现并不能真正帮助我。 – elmt 2010-11-04 20:49:26

+0

这是标记为C++。在任何情况下,'static'几乎都不是线程安全的。预计降价。 – 2010-11-04 20:49:35

+0

-1这根本不回答问题。 – 2010-11-04 21:13:03

1

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

多个线程可以调用 io_service对象:: run()中设立的 线程从完成处理 可调用的游泳池。这种方法也可以与io_service :: post()一起使用,以便使用 一种方法在线程池中执行任何计算 任务。

注意,已加入 用一个io_service的池中的所有线程都认为 等同,并且在 武断的方式。该io_service可以 分布在它们之间的工作。