2017-05-12 1 views
0

Je m'attendais à ce que en utilisant Loop propriété je peux définir si la méthode d'événement OnRun est exécutée à plusieurs reprises, mais malgré tout, il est toujours répéter jusqu'à ce que j'appelle la méthode Terminate. Ai-je manqué le point de cette propriété ou il y a un bogue dans le composant IdThreadComponent?Qu'est-ce que la propriété IdThreadComponent Loop?

+0

Que voulez-vous accomplir? Fournissez-nous un MVCE. – RBA

Répondre

1

interne, TIdThreadComponent exécute un TIdThread, qui a en fait 2 boucles dans sa méthode Execute():

  • Une boucle externe est une boucle while not Terminated habituelle.

  • A l'intérieur de cette boucle, il vérifie d'abord si la méthode Stop() a été appelé à suspendre le fil, puis (après le réveil si arrêté), il vérifie Loop pour déterminer si la méthode Run() doit être appelé une fois ou en une boucle.

Ainsi, la propriété Loop n'a pas vraiment beaucoup d'effet dans TIdThreadComponent, en raison de la boucle while not Terminated extérieure. Tout ce qu'il fait vraiment, c'est de contrôler à quelle fréquence le thread vérifie sa propriété Stopped pour savoir quand se mettre en veille, si jamais.

La logique Loop est principalement destinée à être utilisée par TIdTCPServer à la place, pour contrôler si son événement OnExecute est déclenché une fois ou plusieurs fois pour chaque connexion client acceptée.

+0

Donc, j'ai à peu près mal compris la signification de la propriété. Merci! – Tracer

+0

Pas votre faute. Ce n'est pas un comportement bien documenté –