C ++ Потоковый секундомер - PullRequest
       5

C ++ Потоковый секундомер

1 голос
/ 04 ноября 2010

Я пытаюсь создать секундомер на 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 ]

2 голосов
/ 05 ноября 2010

У вас почти есть это, потому что вы создаете новый поток для обработки io_service::run(), ваш основной поток не будет блокироваться.Две вещи, которые вам нужно сделать,

  1. , убедитесь, что вы набрали Start() перед вами Initialize() (используя тот же экземпляр io_service), таким образом, io_service может что-то сделать, иначе он выйдет!
  2. В вашем методе HandleTimer() снова вызовите async_wait, чтобы поставить в очередь следующий тик, иначе io_service выйдет, так как ему нечего делать.
1 голос
/ 05 ноября 2010

Вы прочитали учебник по асинхронному Boost.Asio ? Добавить несколько потоков довольно просто, создав пул потоков для вызова io_service::run.

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

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

0 голосов
/ 04 ноября 2010

Это работает для меня:

#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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...