Windows API / 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. .....
7 Réponses :
Vous pouvez utiliser QueryPerformEcanceCounter de Winapi . Vérifiez-le avant le démarrage et interrogez si la quantité de temps est passée. Cependant, il s'agit d'une minuterie haute résolution. Pour une résolution plus faible, utilisez gettickcount (millisecondes) .
Tout dépend si vous attendez activement (faire quelque chose) ou d'attendre de manière passive un processus externe. Si ce dernier, alors le code suivant à l'aide de Dormez A > sera beaucoup plus facile: p> si vous n'utilisez pas la veille (ou le rendement) et que votre application vérifie constamment sur une condition, puis vous ferez bouffer la CPU. L'application s'exécute sur. P> Si vous utilisez de manière approfondie Winapi, vous devez essayer une solution plus native, à propos de Winapi's Fonctions de synchronisation . P> P>
Vous oubliez d'incrémenter le comptage à l'intérieur de la boucle XD
Notez que votre solution n'est pas si précise. Spécification d'un sommeil de 10 ms signifie que le sommeil peut être d'environ 10 ms. Cela dépend de la résolution de la minuterie sous-jacente. En outre, s'il existe d'autres threads prioritaires plus occupés de priorité active, vous devrez peut-être attendre encore plus longtemps. Vous ne pouvez donc pas compter sur un sommeil de 10 ms en réalité 10 ms.
@zdan - je doute que l'OP voulait une solution précise. Il peut utiliser QPC avec s'il veut vraiment être précis - et sans au moins dormir (1), il va manger des ressources.
Assurez-vous de faire un SLEEP () CODE> ou RENDUME () CODE> In Youd OU Goindrons toute la CPU (ou Core) en attente. P>
Si vous attendez qu'un drapeau particulier soit défini ou une heure à atteindre, une solution beaucoup plus propre peut être d'utiliser un événement de réinitialisation automatique / manuel. Celles-ci sont conçues pour les conditions de signalisation entre les fils et avoir des API très riches conçues sur eux. Par exemple, vous pouvez utiliser l'API de WayformultiPleObjects qui prend une valeur de délai d'attente explicite. p>
Ne pas sonder pour que les drapeaux puissent changer. Même avec un sommeil ou un rendement pendant la boucle, cela gaspille juste des cycles CPU.
Au lieu de cela, obtenez le fil qui définit les drapeaux pour vous indiquer qu'ils ont été modifiés, en utilisant probablement un événement . Votre attente sur l'événement prend un délai d'attente, que vous pouvez modifier pour permettre une attente de 7 secondes total. P>
Par exemple: P>
Thread1:
flag1 = foo;
SetEvent(hEvent);
Thread2:
DWORD timeOutTotal = 7000; // 7 second timeout to start.
while (flag1 != flag2 && timeOutTotal > 0)
{
// Wait for flags to change
DWORD start = GetTickCount();
WaitForSingleObject(hEvent, timeOutTotal);
DWORD end = GetTickCount();
// Don't let timeOutTotal accidently dip below 0.
if ((end - start) > timeOutTotal)
{
timeOutTotal = 0;
}
else
{
timeOutTotal -= (end - start);
}
}
Vous n'avez pas mentionné ce qui va arriver si les drapeaux sont égaux. p>
En outre, si vous ne les testez pas sans barrières de mémoire, vous ne pouvez pas vous garantir de voir les écrivies effectuées par l'autre thread. P>
Votre meilleur pari est d'utiliser un événement et d'utiliser le waitforsingleObject code> fonction avec une période de 7 000 millisecondes. P>
Si votre application fait quelques éléments de réseautage, consultez l'appel de POSIX SELECT (), en particulier la fonctionnalité Timeout! P>
Je suggère de regarder dans "sondage" ou "sélectionner" (vieille école). Lisez le magnifique guide de réseau Beej pour apprendre à utiliser les deux et la différence: beej.us/guide/bgnet
Je dirais "Vérifiez l'heure et si rien n'est arrivé en sept secondes plus tard, puis casser la boucle. P>
Passez le délai d'attente à la fonction d'attente que votre code contiendra une fois que vous vous débarrassez de cette boucle occupée.
Dans un environnement intégré qui serait une combinaison d'une interruption entraînée par les données et une minuterie ... C / C ++ sont assez bas niveaux. Je me demande si vous pouvez le faire aussi.
Oui. Sous Windows, l'API correspond à
waitforsingleObject () code> et amis.Ne pas mentionner, vous n'utilisez pas les opérations verrouillées pour vérifier ces deux champs qui entraîneront des problèmes.