2010-11-04 4 views
1

Я пытаюсь создать секундомер в C++, что-то похожее на Java TimerTask. Мне нравится их библиотека, так как у нее уже есть потоки. Я видел Boost Chrono, однако он все еще находится в разработке и предпочел бы не использовать его.C++ Threaded Stopwatch

Моя текущая реализация прошла без везения (сейчас я собираюсь по памяти, так что это может быть немного псевдо-код).

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. убедитесь, что вы звоните Start()Initialize() перед вами (используя тот же экземпляр io_service), таким образом, есть что-то для io_service делать, иначе он уйдет!
  2. На вашем методе HandleTimer(), вызовите async_wait снова в очередь на следующий тике, иначе io_service уйдет, поскольку это не имеет никакого отношения к ..
+0

Ваш второй момент был одним из тех моментов, которые были удары по лбу. Но теперь он отлично работает. Спасибо. – elmt

+0

:) круто, все расписание событий, с которыми сложно справиться, тоже заняло некоторое время ... – Nim

-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

+0

Это помечено C++. 'static' вряд ли является поточно-безопасным в любом случае. Ожидайте downvotes. –

+0

-1 это вообще не отвечает на вопрос. –

1

Вы читали Boost.Asio асинхронный deadline timer tutorial? Довольно просто добавить multiple threads, создав пул потоков для вызова io_service::run.

Несколько потоков могут называть io_service :: Run(), чтобы создать пул нитей, из которых обработчики завершения могут быть вызваны. Этот подход может также использоваться с помощью io_service :: post() для использования средств для выполнения любых вычислительных задач в пуле потоков.

Обратите внимание, что все потоки, которые присоединились к бассейна, который io_service в считаются эквивалентными и io_service может распределять работу через них в произвольным образом.