2009-05-16 4 views
1

Cela doit être une question facile, mais je ne trouve pas de réponse adéquate.Classe C++ - Attribut d'incrémentation et de décrémentation toutes les N millisecondes

Je suis en train de coder sur VS-C++. J'ai une classe personnalisée 'Person' avec l'attribut 'height'. Je veux appeler la méthode de classe Grow() qui démarre un timer qui va incrémenter l'attribut 'height' toutes les 0.5 secondes.

Je vais avoir un StopGrow() qui arrête le timer et Shrink() qui décrémente au lieu d'incrémenter.

J'ai vraiment besoin d'une petite poussée sur quelle minuterie à utiliser et comment l'utiliser dans la méthode Grow(). D'autres méthodes doivent être simples après avoir connu cela.

C'est ma première question ici, alors s'il vous plaît soyez gentil (et avertissez-moi si je me trompe :) Pardonnez mon anglais, pas ma langue maternelle.

Répondre

5

Avez-vous vraiment besoin d'appeler le code? chaque demi-seconde pour recalculer une valeur? Pour la plupart des scénarios, il existe un autre moyen beaucoup plus simple, plus rapide et efficace.

N'exposez pas un membre en hauteur, mais utilisez une méthode telle que GetHeight(), qui calculera la hauteur au moment précis où vous en avez besoin.

Votre méthode Grow() définirait une valeur de hauteur de base et l'heure de début et rien d'autre. Ensuite, votre méthode GetHeight() soustraittrait l'heure de début de l'heure actuelle pour calculer la hauteur "en ce moment", quand vous en avez besoin.

Aucun temporisateur nécessaire!

1

Puisque vous êtes sur Windows, la solution la plus simple est probablement d'utiliser la fonction GetTickCount() fournie par Windows.

Il n'y a pas de bonne fonction de temporisation dans le langage C++ avec une précision garantie inférieure à une seconde. Par conséquent, incluez l'en-tête windows.h, puis appelez GetTickCount() pour obtenir un nombre de millisecondes. La prochaine fois que vous l'appelez, vous soustrayez les deux valeurs et si le résultat est supérieur à 500, une demi-seconde s'est écoulée.

Si vous souhaitez bloquer le thread pendant une demi-seconde, utilisez également la fonction Sleep(n), où n représente le nombre de millisecondes pendant lequel le thread doit être mis en veille. (500 dans votre cas)

0

Sommeil() an l'événement de temporisateur normal s'exécute sur une horloge de 10 ms.
Pour les événements de minuterie haute résolution sous Windows, utilisez high resolution timers

0

Pas une question facile du tout! Vous avez au moins deux possibilités:

  • créer un thread qui exécutera une boucle: le sommeil 0.5s, augmenter la hauteur, le sommeil 0.5s, augmenter la hauteur, etc. flux inverse
  • de contrôle et de le transmettre à certains cadre comme Boost :: Asio qui appellera votre gestionnaire de minuterie dans chaque 0.5s.

Afin de prendre la bonne décision, vous devez penser à l'ensemble de votre application. Est-ce qu'il calcule quelque chose (alors peut-être des discussions)? Est-ce qu'il interagit avec l'utilisateur (alors peut-être un événement)? Chaque approche a quelques pièges:

  • Lorsque vous utilisez des threads, vous devez gérer le verrouillage, ce qui peut être difficile. Lorsque vous travaillez sur des événements, vous devez écrire des gestionnaires asynchrones, ce qui peut être difficile.
1

Vous voudrez peut-être regarder CreateTimerQueue() et CreateTimerQueueTimer(). Je ne les ai jamais utilisés personnellement, mais ils feraient probablement l'affaire.

Je génère actuellement un thread chargé d'effectuer des opérations basées sur la minuterie. Il appelle WaitForSingleObject() lors d'un événement de réinitialisation manuelle avec un délai de 10ms.Il conserve une collection interne de rappels sous la forme de pointeur vers méthode et d'objets pour lesquels les rappels sont appelés. Tout cela est caché derrière un singleton qui fournit une interface scheduler qui permet à l'appelant de planifier des appels de méthode sur les objets après une expiration de temporisation ou régulièrement sur un intervalle. Il semble que les deux fonctions que j'ai mentionnées devraient vous donner à peu près la même fonctionnalité ... hmmm ... pourrait être le temps de revoir ce code de programmateur ... ;-)

Questions connexes