Comment tuer un thread en delphi?
À delphes, une méthode de TThread est fin. Il semble un subthread ne peut pas tuer un autre thread par l'appel de résilier ou de gratuit.
Par exemple
Un(formulaire principal), B (un thread unité), C (une autre forme).
B est l'envoi des données du formulaire principal et C (en appelant syncronize), nous avons essayé de mettre fin à un point B dans C, tandis que B est en cours d'exécution en appelant B. mettre fin. Mais cette méthode ne fonctionne pas et que B est encore à travailler jusqu'à ce qu'elle se termine dans la méthode execute.
S'il vous plaît aider. Je vous remercie à l'avance.
Vous devez vous connecter pour publier un commentaire.
Vous devez vérifier pour se terminer dans le thread pour que cela fonctionne. Par exemple:
Avec cela, vous pouvez appeler
Et il va mettre fin dès qu'il a terminé le traitement d'un autre morceau de travail. Ceci est appelé "gracieux fin des threads" parce que le fil lui-même est donné une chance de terminer tout le travail et de se préparer pour la résiliation.
Il y a une autre méthode, appelée "forcé résiliation". Vous pouvez appeler le:
Lorsque vous faites cela, Windows avec force cesse toute activité dans le fil. Cela ne nécessite pas de vérification du mot "Terminé" dans le thread, mais aussi, potentiellement, peut être extrêmement dangereux, parce que vous êtes tuant fil dans le milieu de l'opération. Votre application peut se bloquer après que.
C'est pourquoi vous n'utilisez jamais TerminateThread jusqu'à ce que vous êtes absolument certain que vous avez tous les possibles conséquences compris. Actuellement, vous ne le font pas, il faut donc utiliser la première méthode.
En fait,
actuellement plus de vote réponse à cette question est incorrect (alors que 34 upvoters...) en ce qui concerne la façon de force de tuer un thread.
Vous ne pas utilisation
ThreadId
en tant que paramètre àTerminateThread
procédure. À l'aide deThreadId
sera la cause la plus probable d'un "handle non Valide" erreur ou dans le pire des cas scenerio - va tuer un thread différent.Vous devez passer une fil de poignée en tant que paramètre:
Plus sur les différences entre le fil de la poignée et de l'id peut être trouvé ici.
Modifier
Semble @lui-même corrigé son erreur après avoir vu ma réponse, donc ce n'est plus pertinente.
Mettre fin à ne pas tuer un thread; il définit la
Terminated
propriété d'informer le fil dont il a besoin pour terminer. C'est le fil de la responsabilité de la montre pour laTerminated
et se ferme en douceur.Tous les
Terminate
méthode n'est il définit laTerminated
true à la propriété. Donc, vous devez manuellement garder le contrôle de la propriété et de puis la sortie de la méthode de fil lorsqu'il est défini sur true.Si vous voulez mettre fin à un fil, alors vous pourriez être mieux de frai d'une autre application et de tuer que si vous pensez que l'échec de windows va ensuite nettoyer après vous.