Thread.terminated génère une erreur

Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
- - Dernière réponse : cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
- 14 sept. 2011 à 15:15
Bonjour,

Mon appli (un serveur multi-thread) génère quelquefois (rarement de l'ordre d'une ou deux fois par semaine), une charge anormale du processeur. Cela ne semble gêner en rien l'exécution du serveur, mais cela me préoccupe et je voudrais bien en connaitre la raison.

Toutes les écritures sur le disque sont effectuées en différé par un thread à basse priorité. C'est lui que je soupçonne de ne pas se terminer.

Pour cela je voudrai tester périodiquement l'activité de ce thread et donc je souhaiterai tester Monthread.terminated
Cela génère une erreur à l'exécution du type "Violation d'accès..."

J'ai lu dans les tutoriels et j'ai vu qu'en fait je faisais autrement que ce qui y est décrit. Dans le tutoriel le thread est activé et suspendu à volonté.
Personnellement, j'avis mis FreeonTerminate et je pensais (?) que le thread n'existait plus lorsqu'il avait fini d'exécuter la tâche qui lui était assignée (Ici écrire sur le disque).
Et donc le thread est créé à chaque fois qu'on veut écrire sur le disque. Est-ce une mauvaise pratique?
Afficher la suite 

3 réponses

Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Bonjour,

Il faut t'assurer si ce message d'erreur vient bien du passage dans
la procédure OnTerminate..

ceci pourrait être le résultat d'un objet crée et libéré
deux fois de suite..

Une fois le thread activé, il vaut mieux le suspendre et l'activer
si besoin ensuite.

cantador
Commenter la réponse de cs_cantador
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
Merci de cette réponse. En fait j'ai trouvé l'origine de l'erreur: le test est fait périodiquement à l'intérieur d'un timer, mais la première fois qu'il était appelé le thread n'était pas encore créé.

Mais puisqu'on parle de suspendre et de réactiver le thread, j'ai une interrogation: mon thread actuellement ne boucle pas: il exécute la tâche qui lui est assignée (écrire sur disque) et se termine. J'ai l'impression que pour le suspendre et le réactiver il faudrait changer sa structure et qu'il fonctionne en boucle non?
Commenter la réponse de cs_Gerard
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Bonjour,

Le constructeur hérité de la classe TThread est le suivant :
constructor Create(CreateSuspended: Boolean);

Si CreateSuspended vaut True, alors le thread est initialisé mais sont éxécution est stoppée. Sinon le thread s’exécute dès
qu’il est créé. Pour redémarré un thread qui est suspendu, il suffit de passer sa propriété Suspended à False

mais tout dépend aussi de ce que tu as mis dans l'exécution car la reprise
ne refera pas le boulot de départ :
il va simplement se mettre en pause et reprendre là où il s'est arrêté..

et toi, je sens que ce n'est pas cela que tu veux faire

cantador
Commenter la réponse de cs_cantador