8 votes

Comment obtenir la plus faible consommation d'énergie lors d'une boucle infinie dans un thread ?

1. j'ai quelques boucles infinies, comment puis-je obtenir la consommation de cpu la plus basse ? Dois-je utiliser un délai ?

2) Si j'ai plusieurs threads dans mon application et que l'un d'entre eux est THREAD_PRIORITY_IDLE, cela affecte-t-il les autres threads ?

Mon code est le suivant pour chaque fil

procedure TMatchLanLon.Execute;
begin
 while not Terminated do
  begin
          //some code
          Sleep(1000);
  end;
end;

10voto

Warren P Points 23750

En règle générale, un thread doit dormir jusqu'à ce qu'il reçoive un signal. no en utilisant Sleep o SleepEx .

Vous créez un événement et attendez qu'il soit signalé, soit en utilisant la fonction TEvent ou directement à l'API Win32 avec WaitForSingleObject .

Sleep cause tant de problèmes, y compris ce que j'appelle la maladie de la "Belle au bois dormant". Tout le reste de votre application s'est interrompu et s'est arrêté quelques centaines de fois. microsecondes et votre fil a dormi pendant un "million d'années" en termes de temps informatique relatif, et lorsqu'il se réveille, le reste de votre application s'est terminé depuis longtemps. La prochaine chose que votre thread d'arrière-plan est susceptible de faire est d'accéder à un objet auquel il a une référence, qui a été gelé, et ensuite (si vous avez de la chance) il se plantera. N'utilisez pas Sleep dans les fils. Attendez les événements, ou utilisez un thread de travail prédéfini (comme celui de la bibliothèque OmniThreadLibrary).

6voto

Martin James Points 15655

J'ai quelques boucles infinies, comment puis-je obtenir la plus faible consommation de cpu ?

En bloquant la boucle jusqu'à ce qu'il y ait quelque chose à faire.

Si j'ai plusieurs threads dans mon application et que l'un d'entre eux est THREAD_PRIORITY_IDLE, cela affecte-t-il les autres threads ?

dépend . Probablement pas, mais si d'autres threads attendent une sortie de ce thread, ou la libération d'un verrou de ce thread, alors les autres threads sont effectivement "entraînés vers le bas" à THREAD_PRIORITY_IDLE également.
Outre cette inversion de priorité (qui peut provoquer des blocages lorsque les threads ont plusieurs niveaux de priorité), les spinlocks, une construction de synchronisation qui n'est normalement que mauvaise, peuvent devenir désastreux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X