Comment créer une minuterie en C? p>
Je veux un morceau de code pour récupérer en permanence des données d'une sortie d'analyseurs GPS. P>
Y a-t-il de bonnes bibliothèques pour cela ou devrait-il être écrit auto-écrit? P>
7 Réponses :
Si votre utilisation de Windows, vous pouvez utiliser SETTIMER CODE>
, sinon vous pouvez créer une minuterie de TimegeTime code> et
_breginthreadex code> avec une file d'attente de minuteries avec des rappels P>
On ne "crée pas de minuterie en C". Il n'y a rien sur le calendrier ou la planification dans la norme C, alors comment cela est accompli est laissé jusqu'au système d'exploitation. P>
Ceci est probablement une question raisonnable pour un c noob, autant de langues les em> appuient des choses comme celle-ci. Ada fait, et je crois que la prochaine version de C ++ le fera probablement (Boost en apporte-t-elle maintenant). Je suis à peu près sûr que Java peut le faire aussi. P>
sur Linux, probablement le meilleur moyen d'utiliser pthread art. En particulier, vous devez appeler pthread_create () et transmettre l'adresse de votre routine, qui contient probablement une boucle avec un Sleep () (ou USLEeP () ) Appelez en bas. P>
Notez que si vous voulez faire quelque chose qui se rapproche de la planification en temps réel, juste faire un butier uleep () code> n'est pas assez bon car il ne tiendra pas compte du temps d'exécution de la boucle lui-même. Pour ces applications, vous devrez configurer un minuterie périodique et attendre cela. p>
Comment puis-je exécuter une fonction dans une boucle dans son propre fil?
@ Helium3 - Utilisez les appels OS (qui dépendent de quels systèmes d'exploitation que vous utilisez, que vous devez encore nous dire) ou utilisez une meilleure langue.
Il sera exécuté sur Ubuntu sur un pandaboard.
[Pedantic] Une langue «meilleure» est définie par un support de synchronisation? drôle.
@ssijn - Pour ce but particulier, oui une langue qui a un soutien réel pour le filetage (même dans une bibliothèque portable comme Boost) serait mieux. C a aussi ses stripts, mais ce n'est pas l'un d'entre eux.
La question à propos d'une minuterie est assez non spécifique, bien qu'il y ait deux fonctions qui me viennent à l'esprit qui vous aideront: P>
Voir Mangages pour plus d'explication :) P>
SDL fournit une minuterie de plate-forme croisée en c. P>
http://www.libsdl.org/cgi/docwiki.cgi/sdl_addtimer < / a> p>
Il semble s'agir d'un cadre conçu autour du multimédia. Il devait utiliser son "mainloop" et mettre en place un rappel de la minuterie. Pourrait être utile, si ce type de structure est acceptable.
@ T.e.d. Il est conçu pour le multimédia, mais j'ai trouvé ses minuteries et sa file d'attente d'événement d'être pratique par elles-mêmes.
sur les systèmes POSIX Vous pouvez créer (et attraper) un Alarme . L'alarme est simple mais réglée en quelques secondes. Si vous avez besoin de résolution plus fine que des secondes, utilisez SETTITIMER .
struct itimerval tv; tv.it_interval.tv_sec = 0; tv.it_interval.tv_usec = 100000; // when timer expires, reset to 100ms tv.it_value.tv_sec = 0; tv.it_value.tv_usec = 100000; // 100 ms == 100000 us setitimer(ITIMER_REAL, &tv, NULL);
Méthode la plus simple disponible:
#include <pthread.h> void *do_smth_periodically(void *data) { int interval = *(int *)data; for (;;) { do_smth(); usleep(interval); } } int main() { pthread_t thread; int interval = 5000; pthread_create(&thread, NULL, do_smth_periodically, &interval) ... }
Ne pas descendre, mais il a également mentionné qu'il l'ait voulu être exécuté dans un fil séparé, le code pour créer un thread et exécuter do_smth_periodifier () code> de manière aussi utile. De plus, cette méthode entraînera la variation de l'ensemble du temps de "mur" de la boucle en fonction du temps qu'il faut pour faire
do_smth () code> chaque itération. Très probablement, c'est bien pour sa candidature.
Condition de course AVERTISSEMENT: veillez à garder intervalle code> variable en mémoire lorsque vous appelez
pthread_create code> d'une autre fonction au lieu de
Main () code>, car
intervalle code> peut devenir hors de portée avant l'affectation du thread de
* Données code> argument dans la première ligne.
Si les données GPS provenaient d'un périphérique matériel, comme sur un port série, une chose que vous pouvez envisager de changer l'architecture autour de sorte que l'analyseur commence le code que vous essayez de courir lorsque plus de données sont disponible. p>
Cela pourrait faire cela à travers une fonction de rappel ou peut envoyer un événement - la mise en œuvre effective dépendrait de ce que vous avez disponible. P>
Pouvez-vous être un peu plus précis? Comment allez-vous l'analyse de la sortie? Il est vraiment difficile de comprendre ce que vous demandez.
Ne vous inquiétez pas de l'analyse. J'aimerais juste savoir comment créer une fonction de minuterie en C qui boucle et exécute ses déclarations.
Basé sur des commentaires ultérieurs, ajouté Linux aux balises