2010-11-04 50 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可以 分佈在它們之間的工作。