cs_Gerard
Messages postés121Date d'inscriptionjeudi 10 janvier 2002StatutMembreDernière intervention 7 août 2018
-
7 sept. 2011 à 09:30
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 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?
cs_Gerard
Messages postés121Date d'inscriptionjeudi 10 janvier 2002StatutMembreDerniè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?
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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