2010-11-04 4 views
1

J'essaie de créer un chronomètre en C++, quelque chose de similaire à Java TimerTask. J'aime leur bibliothèque car elle a déjà un thread intégré. J'ai vu Boost Chrono, cependant, il est encore en développement et préfèrerait ne pas l'utiliser.C++ Threaded Stopwatch

Ma mise en œuvre actuelle a été sans succès (je vais par la mémoire en ce moment, donc cela pourrait être un peu comme pseudo code).

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; 
} 

Ce que je voudrais avoir est d'avoir le fil en permanence appeler Tick() et imprimer l'heure actuelle. En outre, ma mise en œuvre actuelle semble avoir le fil comme bloquer le reste de l'application, ce qui est certainement quelque chose que je ne veux pas. Comment ferais-je ces deux choses? Je suis un noob quand il s'agit de filetage alors s'il vous plaît pardonnez-moi si j'ai déclaré quelque chose qui ne semble pas correct.

Répondre

2

Vous l'avez presque, car vous créez un nouveau thread pour gérer io_service::run(), votre thread principal ne bloquera pas. Deux choses que vous devez faire,

  1. assurer que vous appelez Start() avant Initialize() (en utilisant la même instance de io_service), de cette façon il y a quelque chose pour le io_service faire, sinon il va quitter!
  2. Sur votre méthode HandleTimer(), appelez async_wait à nouveau faire la queue la prochaine tique, sinon io_service QUITTE car il n'a rien à voir ..
+0

Votre deuxième point était l'un de ces moments de slap-the-front. Mais ça fonctionne bien maintenant. Je vous remercie. – elmt

+0

:) cool, tout le calendrier des événements est difficile à comprendre, m'a pris un moment aussi ... – Nim

-2

Cela fonctionne pour moi:

#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

Je cherche un chronomètre fileté afin que je puisse toujours appeler 'Tick' . Cette implémentation ne m'aide pas vraiment. – elmt

+0

Ceci est étiqueté C++. 'static 'est rarement thread-safe dans tous les cas. Attendez-vous à des downvotes. –

+0

-1 cela ne répond pas du tout à la question. –

1

Avez-vous lu le Boost.Asio asynchrone deadline timer tutorial? Il est assez trivial d'ajouter multiple threads en créant un pool de threads pour appeler io_service::run.

Plusieurs threads peuvent appeler io_service :: run() pour mettre en place un pool de threads dont les gestionnaires d'achèvement peuvent être invoquées. Cette approche peut également être utilisée avec io_service :: post() pour utiliser un moyen d'effectuer toutes les tâches de calcul à travers un pool de threads.

Notez que toutes les discussions qui ont rejoint piscine pour un io_service sont considérés comme équivalents et le io_service peuvent distribuer le travail à travers eux dans une façon arbitraire.

Questions connexes