Quelle est la façon la plus propre de créer un délai d'attente pour une boucle while?
API Windows/C/C++
1. ....
2. ....
3. ....
4. while (flag1 != flag2)
5. {
6. SleepEx(100,FALSE);
//waiting for flags to be equal (flags are set from another thread).
7. }
8. .....
9. .....
Si les indicateurs ne sont pas égaux les uns aux autres après 7 secondes, je voudrais continuer à la ligne 8.
Toute aide est appréciée. Merci.
- Passer le délai d'attente de la fonction d'attente de votre code contiendra une fois que vous vous débarrasser de cette boucle occupée.
- Dans un environnement intégré qui serait une combinaison de données, et de la minuterie-driven interrompre ... C / C++ sont assez bas niveau. Je me demande si vous pouvez le faire aussi.
- Oui. Dans l'API Windows pour il est
WaitForSingleObject()
et amis. - Pour ne pas mentionner, vous n'êtes pas à l'aide de Contrefil des opérations de contrôle de ces deux champs, le résultat sera en difficulté
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en attente pour un pavillon particulier à configurer ou un temps pour être atteint, une grande femme de la solution peut être d'utiliser un auto /manuel d'événement de réinitialisation. Ceux-ci sont conçus pour la signalisation de conditions entre les threads et ont très riche Api conçu sur le dessus d'eux. Par exemple, vous pourriez utiliser le WaitForMultipleObjects API qui prend explicitement la valeur de délai d'expiration.
Ne pas faire un sondage pour les drapeaux pour changer. Même avec un sommeil ou le rendement au cours de la boucle, c'est juste déchets de cycles CPU.
Au lieu de cela, obtenir le fil qui définit l'indicateur de signal vous qu'ils ont été modifiés, probablement à l'aide d'un l'événement. Votre attendre l'événement prend un délai d'attente, que vous pouvez modifier pour permettre d'attente de 7 secondes au total.
Par exemple:
Vous avez omis de parler de ce qui va se passer si les drapeaux sont égaux.
Aussi, si vous venez de les tester sans les barrières de la mémoire alors vous ne pouvez pas garantir à voir toutes les écritures faites par l'autre thread.
Votre meilleur pari est d'utiliser un Événement, et l'utilisation de la
WaitForSingleObject
fonction de 7000 milliseconde temps.Vous pouvez utiliser QueryPerformanceCounter de WinAPI. Vérifiez avant tout démarre, et de la requête si le temps a passé. Cependant, c'est une haute résolution de la minuterie. Pour une résolution plus faible utilisation GetTickCount (millisecondes).
Tout dépend si vous êtes activement en attente (faire quelque chose) ou passive d'attente pour un processus externe. Si ce dernier, alors le code suivant à l'aide de Le sommeil sera beaucoup plus facile:
Si vous n'utilisez pas le Sommeil (ou le Rendement) et votre application est constamment vérifier sur une condition, alors vous allez gonfler le PROCESSEUR de l'application est en cours d'exécution sur.
Si vous utilisez WinAPI largement, vous devriez essayer une solution native, lire à ce sujet WinAPI est Les Fonctions De Synchronisation.
Assurez-vous de faire un
sleep()
ouyield()
là ou vous allez manger à tous l'ensemble de la CPU (ou de base) en attente.Je dirais "vérifier le temps et si rien ne s'est passé en sept secondes plus tard, puis briser la boucle.
Si votre application fait un peu de mise en réseau des trucs, avoir un regard sur la POSIX appel select (), en particulier le délai d'attente de la fonctionnalité!