2011-03-03 1 views
10

J'ai écrit une classe Thread.descendent et dans la méthode d'exécution j'ai mis une boucle infinie pour écouter un événement com, est considéré comme une mauvaise pratique Threading utiliser une boucle infinie pour le faire? les applications fonctionnent bien, ne gèlent pas et sont toujours sensibles, je réponds juste parce que je veux utiliser la meilleure méthode pour enfiler.Est-il considéré comme une mauvaise pratique de placer une boucle infinie à l'intérieur de TThread.Execute?

procedure TMyThread.Execute; 
begin 
    while True and not Terminated do 
    begin 
    AResult:= FListener.GetResult(Param1,Param2,5000); 
     if not VarIsNull(AResult) then 
     Synchronize(Process); 
    end; 
end; 
+13

S'il y a un événement qui termine la boucle, ce n'est pas vraiment Infinite maintenant? – drudge

+0

FListener.GetResult attend-il s'il n'y a pas d'événement? –

+0

Pour arrêter le thread, j'utilise 'TMyThread.Terminate', vérifiez la ligne' while True et non Terminé do' où je vérifie si le thread est terminé. ' – Salvador

Répondre

7

C'est correct de le faire. Vous vérifiez Terminated, ce qui est bon. Si votre écouteur le permet et que votre utilisation du processeur est trop élevée, vous pouvez ralentir votre thread en mettant un Sleep (1) dedans, mais je pense que ce ne sera pas nécessaire.

+5

Bien qu'il soit techniquement correct, il est totalement inutile et rend le code plus difficile à lire. Comme l'a souligné @David Heffernan, 'True and Not Terminated' équivaut à 'Non Terminated', et le second est beaucoup plus facile à lire. (Pas downvote, cependant, parce que * est * techniquement correct même si c'est redondant et inutile.) –

+1

Oui. Le «vrai» pourrait être enlevé. Ma réponse était plus sur l'utilisation générale d'une boucle while dans un thread, qui est ce que cette question est en réalité. – GolezTrol

+1

Et je vois que l'auditeur a lui-même un timeout. Cela rend ma suggestion de mettre un sommeil supplémentaire dans le fil inutile. – GolezTrol

14

Le compilateur transforme cela en:

while not Terminated do 

Quand écrit de cette façon, je suis sûr que vous serez d'accord, il semble parfaitement naturel. C'est un idiome très commun.

Questions connexes