PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → [WD23] Conseil sur un thread
[WD23] Conseil sur un thread
Iniciado por Der§en, 16,ene. 2019 12:59 - 6 respuestas
Miembro registrado
334 mensajes
Publicado el 16,enero 2019 - 12:59
Bonjour,

J'ai codé un thread qui est exécuté au lancement de mon programme, ce thread va lire , le status de plusieurs services sur mon serveur.

Pour qu'il sorte proprement du thread quand l'utilisateur clic sur la fermeture du programme, je met ma variable globale a Vrai, et je teste cette variable dans mon thread pour quiter le thread le plus proprement possible.
gbSortieDuProgramme est un booléen, section critique
gbSortieDuProgramme = Faux


TEMPS_SERVICES est égale a 300 pour faire 5 minutes entre chaque exécution du thread.

AffichageDesServices est une procédure qui affiche dans un mémo le résultat du traitement.

Dite moi si c'est propre d’après vous ou s'il y a des choses a corriger ?
Procedure ListeDesServices()
nAttente est un entier
sMaListe est une chaîne

BOUCLE
sMaListe = ""
sMaListe += EtatEnTexte("SFTP")
sMaListe += EtatEnTexte("ILE01")
sMaListe += EtatEnTexte("ILE02")
sMaListe += EtatEnTexte("ILE03")
sMaListe += EtatEnTexte("ILE04")

ExécuteThreadPrincipal(AffichageDesServices, sMaListe)

nAttente = 0
TANTQUE nAttente < TEMPS_SERVICES
// pause de 2 secondes
ThreadPause(2s)

// Incrémente de 2 le compte de temps
Ajoute(nAttente, 2)

// Sort du thread si le programme demande a sortir en ayant mis le booléen a Vrai
SI gbSortieDuProgramme ALORS ThreadFin()
FIN
FIN


PROCEDURE INTERNE EtatEnTexte(LOCAL plEtat est une chaîne): chaîne

lsRésultat est une chaîne

SELON ServiceEtat(plEtat, "SRV-Prods")
CAS serviceEtatArrêté: lsRésultat = "Arrêté"
CAS serviceEtatAttenteArrêt: lsRésultat = "Attente Arrêt"
CAS serviceEtatAttenteDémarrage: lsRésultat = "Attente Démarrage"
CAS serviceEtatAttentePause: lsRésultat = "Attente Pause"
CAS serviceEtatAttenteRelancement: lsRésultat = "Attente Relancement"
CAS serviceEtatDémarré: lsRésultat = "Démarré"
CAS serviceEtatEnPause: lsRésultat = "En Pause"
CAS serviceEtatTimeout: lsRésultat = "Timeout"
AUTRE CAS:
lsRésultat = "Indéterminé"
FIN

RENVOYER ChaîneConstruit("- %1 : %2.%3", plEtat, lsRésultat, CR)
FIN

// FIN de ListeDesServices()


--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Miembro registrado
1.640 mensajes
Publicado el 16,enero 2019 - 14:50
Hello,

Oui çà à l'air correct.
tu peux même mettre à la place de BOUCLE :

TANTQUE PAS gbSortieDuProgramme ALORS
// Ton traitement en boucle
FIN
Miembro registrado
334 mensajes
Publicado el 16,enero 2019 - 16:02
Merci pour le conseil, je vais faire la modif...

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Publicado el 16,enero 2019 - 17:28
Si "ListeDesServices" est bien la procédure lancée en Thread, pourquoi ne pas seulement sortir de la procédure lorsque gbSortieDuProgramme est à Vrai ?

// Sort du thread si le programme demande a sortir en ayant mis le booléen a Vrai
SI gbSortieDuProgramme ALORS RETOUR


Au moins le thread se termine "normalement"

Mais peut-être ai-je loupé quelque chose...
Miembro registrado
334 mensajes
Publicado el 16,enero 2019 - 20:40
Christophe PRADEL a écrit :
Si "ListeDesServices" est bien la procédure lancée en Thread, pourquoi ne pas seulement sortir de la procédure lorsque gbSortieDuProgramme est à Vrai ?

// Sort du thread si le programme demande a sortir en ayant mis le booléen a Vrai
SI gbSortieDuProgramme ALORS RETOUR


Au moins le thread se termine "normalement"

Mais peut-être ai-je loupé quelque chose...


Je vais tester ton idée mais le but de Threadfin est de m’assurer que le Thread est bien arrêté quand le programme s’arrete.

Ce qui n’est pas le cas actuellement, cela qui m’oblige à utiliser ThreadEtat et ThreadAttend en sortie de programme.

Donc, s’il y a une meilleure façon de faire, je suis preneur...

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Miembro registrado
334 mensajes
Publicado el 17,enero 2019 - 11:21
Il y a un truc que je fait surement mal car quand je quitte le programme sans aucun code pour stopper les thread dans la partie "Fermeture de la FEN_" et que le 'ThreadFin()' est bien présent dans ma procédure...

J'ai ce genre d'erreur:
1 Le thread 'SFTP' est toujours en cours d'exécution.
Un arrêt forcé a été déclenché mais ceci peut provoquer des dysfonctionnements dans les autres threads.
Mettez en place un système d'arrêt depuis le code du thread lui-même grâce la fonction ThreadFin.


Une idée ou suggestion ?

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -
Miembro registrado
334 mensajes
Publicado el 19,enero 2019 - 22:12
Comme j’ai des « surprises » à la fermeture de mon programme.

Je suis à la recherche d’un exemple de fonctionnement d’un thread secondaire qui fonctionne tout le temps du programme, quelqu’un aurait un exemple propre ?

--
———————————————————————————————————
Ce qui se conçoit bien se code clairement et se débogue facilement...

- Pastiche d’une citation de Nicolas Boileau -