Thread.terminated génère une erreur

cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018 - 7 sept. 2011 à 09:30
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 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?

3 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
13 sept. 2011 à 11:53
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
0
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
13 sept. 2011 à 13:17
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?
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 14
14 sept. 2011 à 15:15
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
0