2010-05-29 7 views
1

Cela m'ennuie vraiment comme je l'ai fait avant, il y a environ un an et je ne peux pas me rappeler de quelle bibliothèque il s'agissait. Fondamentalement, le problème est que je veux être en mesure d'appeler une méthode un certain nombre de fois ou pour une certaine période de temps à un intervalle spécifié. Un exemple serait que je voudrais appeler une méthode "x" à partir de maintenant, 10 fois, une fois toutes les 0,5 secondes. Sinon, appelez la méthode "x" à partir de maintenant, 10 fois, jusqu'à ce que 5 secondes se soient écoulées.Appeler une méthode à un taux d'intervalle spécifique en C++

Maintenant je pensais que j'utilisais une bibliothèque de boost pour cette fonctionnalité mais je n'arrive pas à la trouver maintenant et je me sens un peu ennuyée. Malheureusement, je ne peux plus regarder le code car je n'en suis plus en possession. Sinon, j'aurais pu rêver tout ça et ça aurait pu être du code propriétaire. En supposant qu'il n'y a rien là-bas qui fait ce que je voudrais, quelle est actuellement la meilleure façon de produire ce comportement? Il devrait être à haute résolution, jusqu'à une milliseconde.

Cela n'a pas d'importance s'il bloque le thread à partir duquel il est exécuté ou non.

Merci!

+0

Vous pouvez indiquer la plate-forme sur laquelle vous effectuez cette opération (ou est-ce multi-plateforme?) Et les versions compilateur/std lib/que vous utilisez. – sbi

+0

Oh, et un référentiel de code SCM personnel avec l'histoire, en utilisant l'outil que vous aimez, est très pratique dans de nombreuses situations. Regardez dans mercurial, svn git, ou tout autre que vous aimez. – sbi

+0

Désolé, actuellement je développe pour Unix/Linux. J'utilise un référentiel de code SCM personnel, ce n'est pas le problème de ne pas avoir le code précédent. Le problème est que je ne travaille plus dans cette entreprise et que je n'ai évidemment pas pris toute la base de code quand je suis parti. Merci pour la suggestion cependant. – Aetius

Répondre

1

Une combinaison de boost :: this_thread :: sleep et durée de temps trouvée dans boost :: datetime?

1

Il est probablement mauvais de répondre à votre propre question, mais je voulais ajouter quelque chose de plus à ce que Nikko a suggéré car je n'ai pas implémenté la fonctionnalité avec les deux bibliothèques suggérées. Quelqu'un pourrait trouver cela utile à un moment donné.

void SleepingExampleTest::sleepInterval(int frequency, int cycles, boost::function<void()> method) { 
    boost::posix_time::time_duration interval(boost::posix_time::microseconds(1000000/frequency)); 
    boost::posix_time::ptime timer = boost::posix_time::microsec_clock::local_time() + interval; 

    boost::this_thread::sleep(timer - boost::posix_time::microsec_clock::local_time()); 

    while(cycles--) { 
     method(); 

     timer = timer + interval; 
     boost::this_thread::sleep(timer - boost::posix_time::microsec_clock::local_time()); 
    } 
} 

J'espère que les gens pourront comprendre cet exemple simple que j'ai fait tomber. Utiliser une fonction liée juste pour permettre la flexibilité.

Apparaît pour fonctionner avec une précision d'environ 50 microsecondes sur ma machine. Avant de prendre en compte le décalage du temps nécessaire à l'exécution de la méthode, la précision était de quelques centaines de microsecondes, ce qui en valait vraiment la peine.

+0

Peut-être que ça n'existait pas, mais vraiment, préférez 'sleep_until' ou - encore plus sensé -' sleep_for' au lieu de 'sleep'. De plus, sur certains systèmes, l'arithmétique sur les durées des horloges non monotones peut déborder, conduisant à des bugs, donc je l'éviterais. – sehe

+0

Preuve de concept: [en utilisant boost] (http://coliru.stacked-crooked.com/a/53a9a15037ffa6f9) et [en utilisant les nouvelles fonctionnalités standard de la bibliothèque] (http://coliru.stacked-crooked.com/a/19ba9ca1c9babf62).Notez qu'il n'y a presque aucune différence en dehors de s/boost/std / – sehe

4

Peut-être que vous parlez de boost::asio. Il est principalement utilisé pour la mise en réseau, mais il peut être utilisé pour planifier les minuteries.

Il peut être utilisé conjointement avec boost :: threads.

Questions connexes