我正在尝试用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()
并打印出当前时间。此外,我当前的实现似乎有线程阻止应用程序的其余部分,这是我绝对不想要的。我怎么做这两件事?
当涉及到线程时,我是一个菜鸟所以请原谅我,如果我说的话似乎不对。
答案 0 :(得分:2)
你几乎拥有它,因为你正在创建一个新的线程来处理io_service::run()
,你的主线程不会阻塞。你需要做的两件事,
Start()
之前调用Initialize()
(使用相同的io_service实例),这样io_service就可以做了,否则它会退出!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 );
}