2009-07-13 5 views
2

Hej!Temporisateur portable pour une période d'environ 100ms

Je suis à la recherche d'un moyen portable de distribuer périodiquement une tâche dans un projet C++. L'utilisation de bibliothèques telles que boost devrait être évitée dans ce projet particulier.

L'exigence de résolution n'est pas trop grave: entre 5Hz et 20Hz sur un netbook moyen.

Le projet utilise OpenGL pour rendre l'IHM mais comme je travaille sur la partie backend, je ne la connais pas très bien.

Merci de votre tout conseil ou suggestions, Arne

EDIT: Qu'est-ce que notre classe 'tâche' ne fait crée un fil à l'aide soit CreateThread (..) pour les fenêtres ou pthread_create (..) pour linux.

+0

L'ensemble des plates-formes cibles est-il connu à l'avance? – sharptooth

+0

oui bien sûr: windows xp et linux, éventuellement ubuntu – Arne

+0

@Arne Vous devriez mettre cette clarification à la fin de votre question en le suppliant avec la marque [EDIT] et supprimer votre commentaire afterwords. –

Répondre

1

Comme moyen le plus simple d'y parvenir est d'utiliser Sleep (100ms) dans un cycle, tout ce dont vous avez besoin est un sommeil portatif. Pour Linux, il peut être implémenté comme suit

void Sleep(unsigned long ulMilliseconds) 
{ 
    struct timeval timeout; 
    timeout.tv_sec = 0; 
    timeout.tv_usec = ulMilliseconds * 1000; 
    select(1, NULL, NULL, NULL, &timeout); 
} 
0

Eh bien, je pense que vous pouvez trouver beaucoup de bibliothèques qui incluent ce genre de chose, comme Glibmm/sigc++, mais je pense que c'est un gros marteau pour votre ongle. Comme je suppose que vous avez déjà des bibliothèques avec lesquelles travailler, si elles incluent le multithreading portable et aucune minuterie périodique, vous pouvez concevoir un moyen simple de le faire par vous-même. Si l'exigence de minutage est faible, commencez simplement un thread qui exécute une boucle infinie qui dort et appelle votre méthode de rappel quand il se réveille. Vous pouvez utiliser sigc++ pour gérer vos rappels car il est léger. Si vous n'avez pas de threads et autres et que vous ne voulez pas utiliser boost, vous pouvez essayer Glibmm. mais si vous ne voulez pas boost je suppose que vous ne voudrez pas une si grande bibliothèque ne :-)

my2cents. 
1

Puisque vous connaissez déjà le jeu complet des systèmes cibles que vous pouvez suivre la voie SQLite. Ils ont exactement le même problème - beaucoup de choses qu'ils utilisent dépendent du système.

Tous les éléments dépendants du système sont implémentés séparément pour chaque système cible et la bonne version est compilée en fonction des directives du préprocesseur.

+0

Merci. En effet, le #define a contrôlé la compilation exactement ce qui se passe en ce moment. Ce que je cherche est une sorte d'API "cachée" qui permet de définir une période d'un thread dans les deux systèmes cibles. J'ai peur que je suis obligé de déployer ma propre solution ... – Arne

+0

Façon très portable, en effet ... –

+0

Que voulez-vous dire par "caché"? – sharptooth

1

Si vous voulez un déclenchement périodique, un thread qui dort 100ms dans une boucle peut faire l'affaire.

Questions connexes