Je souhaite implémenter des tâches interruptibles basées sur des threads d'arrière-plan. Quel est le moyen le plus propre d'implémenter la méthode TTask.Stop
? Comment puis-je abandonner le thread d'arrière-plan?Annuler un fil?
Le code exécuté dans le contexte de thread est passé à la tâche en utilisant une méthode anonyme et peut contenir des appels bloquants, donc je ne peux pas compter sur le fait que le drapeau Terminated
est vérifié régulièrement depuis le code.
Merci pour toute contribution.
Utiliser D2010 dans le cas où il importe (certaines choses dans TThread
semblent avoir changé)
C'est une bonne réponse (+1); cf. Python threading, où beaucoup est fait du Global Interpreter Lock qui est responsable à la fois de la sécurité du thread (bien) et à toutes fins pratiques limite le code multithread à un seul noyau (mauvais). La meilleure solution à ce problème consiste à ne pas utiliser de threads, mais plutôt des processus via le package multitraitement, et ce qui est gagné par cette capacité instantanée de mise à l'échelle sur plusieurs machines, ce qui devient nécessaire pour une mise à l'échelle importante. Au lieu de se soucier de la sécurité des threads, il serait préférable d'avoir une gestion multi-processus facile (plus facile) dans Delphi. –
Les sémaphores n'ont pas un état "abandonné" car ils n'ont aucune notion intégrée de propriété. (En ce qui concerne l'OS, un thread ne peut pas "tenir" un sémaphore.) Seul un mutex peut être abandonné de manière détectable. –
Cela peut être une bonne façon de mettre en œuvre des tâches interruptibles avec le code de blocage, mais je ne vois pas comment la fonctionnalité dans la question (une tâche interruptible pour les méthodes anonymes) devrait être mis en œuvre comme celui-ci avec Delphi. Il devrait y avoir un compilateur d'exécution, pour créer un exécutable (être engendré comme un processus différent) de la méthode anonyme, pas là? – mghie