PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Comment savoir si un thread est terminé
Comment savoir si un thread est terminé
Iniciado por nicossimo53, 22,nov. 2004 11:10 - 9 respuestas
Publicado el 22,noviembre 2004 - 11:10
Bonjour à tous et tout d'abord merci pour la qualité de vos réponses.
Voilà je développe une application utilisant des Threads et j'aimerais savoir s'il était possible de savoir si le dernier thread lancé était terminé.
En fait, je lance une vingtaine de threads simultanément et j'aimerais attendre la fin du dernier thread pour redonner la main à l'utilisateur, ça pourra sûrment lui éviter des faire planter l'appli.
Merci et à très bientôt.
Nico.
Publicado el 22,noviembre 2004 - 11:32
Bonjour, utilise la fonction ThreadEtat(<Nom du thread>)

celle-ci te renvoi les constantes suivantes :
ThreadEncours Le thread est en cours d'exécution

ThreadInexistant Le thread n'a pas été créé ou a été détruit

ThreadSuspendu Le thread est suspendu

cordialement



"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
41a1a338@news.pcsoft.fr...

Bonjour à tous et tout d'abord merci pour la qualité de vos réponses.
Voilà je développe une application utilisant des Threads et j'aimerais
savoir s'il était possible de savoir si le dernier thread lancé était
terminé.
En fait, je lance une vingtaine de threads simultanément et j'aimerais
attendre la fin du dernier thread pour redonner la main à l'utilisateur,
ça pourra sûrment lui éviter des faire planter l'appli.
Merci et à très bientôt.
Nico.
Publicado el 22,noviembre 2004 - 12:11
Bonjour,

Faire un autre Thread (un de plus) qui vérifie tous les autres avec l'instruction ThreadEtat et puis se termine quand l'ensemble des autres sont finis.

Salutations.
Publicado el 22,noviembre 2004 - 12:40
Merci de ta réponse mais voici le code :

POUR i = 1 A TableOccurrence(TBL_PLAT)
SI B_MAJ_AUTO[i] = 2 ET B_PROG[i] = 2 ALORS
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
gNbEnvoi++
FIN
FIN
SI ThreadEtat("Thread"+gnbenvoi) = threadInexistant ALORS
Trace("OK")
FIN

Je mets un point d'arrêt sur le SI et quand j'éxécute pas à pas, la fonction ThreadEtat ne me renvoie pas une constante mais -1.

Donc en fait ça ne me permet pas de déverouiller les boutons de la fenêtre uniquement à la fin de tous les envois.

Nico
Publicado el 22,noviembre 2004 - 13:51
Bonjour,

LOCAL
Temp est une chaine

Temp=""
POUR i = 1 A TableOccurrence(TBL_PLAT)
SI B_MAJ_AUTO[i] = 2 ET B_PROG[i] = 2 ALORS
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
Temp+="1"
FIN
FIN
TANTQUE Position(Temp,"1")
Pour i = 1 A TBL_PLAT..Occurrence
SI ThreadEtat("Thread"+i) = threadInexistant ALORS
Temp[[i]]="0"
Fin
Fin
FIN

A optimiser au niveau de la boucle TANTQUE
Bonne journée


"Nico" <nicossimo53@hotmail.com> a écrit dans le message de news:
41a1b851@news.pcsoft.fr...

Merci de ta réponse mais voici le code :

POUR i = 1 A TableOccurrence(TBL_PLAT)
SI B_MAJ_AUTO[i] = 2 ET B_PROG[i] = 2 ALORS
ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
gNbEnvoi++
FIN
FIN
SI ThreadEtat("Thread"+gnbenvoi) = threadInexistant ALORS
Trace("OK")
FIN

Je mets un point d'arrêt sur le SI et quand j'éxécute pas à pas, la
fonction ThreadEtat ne me renvoie pas une constante mais -1.

Donc en fait ça ne me permet pas de déverouiller les boutons de la fenêtre
uniquement à la fin de tous les envois.

Nico
Publicado el 22,noviembre 2004 - 14:35
Salut,

Donc en fait ça ne me permet pas de déverouiller les boutons de la fenêtre
uniquement à la fin de tous les envois.


Perso, je pense que cela ne peut pas marcher correctement.
Qui te dis que le dernier thread lancé sera le dernier à se terminer?

Raisonnes plutôt de la manière suivante: "Pour réafficher mes boutons,
je dois attendre que TOUS les threads soient terminés".

Si j'en crois ta procédure "EnvoiFichier", tu dois gérer l'envoi
simultanés de fichiers.

Imaginons que ta boucle lances 3 threads.
Le premier gère l'envoi d'un fichier de 10Mo (Thread1)
Le second gère l'envoi d'un fichier de 100Ko (Thread2)
Le troisième gère l'envoi d'un fichier de 10Ko (Thread3)

Les threads finiront dans cet ordre: 3,2,1 (Ou alors, faux vérifier ton
réseau ;-)

Thread3 (le dernier lancé) va finir en premier et tu vas te dépêcher de
déverouiller tes boutons...
Erreur, car les deux autres seront toujours en cours... ;-)

Il faut que tu utilises les signaux.
ATTENTION, je tape en dehors de Windev donc faut vérifier le code
qdmême!

1°) Lancer un thread //

POUR i = 1 A TableOccurrence(TBL_PLAT)
SI B_MAJ_AUTO[i] = 2 ET B_PROG[i] = 2 ALORS

ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
gNbEnvoi++
FIN
FIN

ThreadExecute("Update_Buttons",threadnormal,"Update_Buttons",gNbEnvoi)

2°) Modifies ta procédure "EnvoiFichier"

Ajoutes à la fin: ThreadEnvoiSignal("Update_Buttons")
Chaque fois qu'un thread se terminera, il l'annoncera au thread //

3°) Ajoute la procédure suivante:

Procédure Update_Buttons(nThreadsLancés)

nThreadsTerminés est un entier

Début:
ThreadAttendSignal(infini)

nThreadsTerminés++
si nThreadsTerminés<nThreadsLancés alors goto Début

// Incorporer ici le code pour déverouiller les boutons de ta fenêtre

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Publicado el 22,noviembre 2004 - 14:56
DENIS ZEIGIN a couché sur son écran :

Bonjour,

Faire un autre Thread (un de plus) qui vérifie tous les autres avec
l'instruction ThreadEtat et puis se termine quand l'ensemble des autres sont
finis.


C'est une solution, mais j'ai préféré donner a "Nico" une solution avec
"signaux".

Dans ta proposition, le thread tourne en boucle jusqu'à ce que tous les
autres threads soient terminé => Consommation CPU.
Avec gestion des signaux, un "ThreadAttendSignal" bloque le thread et
ne consomme aucune ressource.

A+

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Publicado el 22,noviembre 2004 - 15:36
Tout d'abord bonjour,

Un grand merci pour ton aide. Ta solution fonctionne à merveille.

Merci aussi à ceux qui ont répondu à mon message.

A bientôt.
Nico.
Publicado el 22,noviembre 2004 - 19:04
Nico a formulé la demande :

Salut,

> Un grand merci pour ton aide. Ta solution fonctionne à merveille.

De rien mais après relecture, il faudrait bloquer tes threads AVANT de
lancer le thread "Update_Buttons" !
En effet, si un thread (lancé dans ta boucle POUR/FIN) se termine avant
que le thread "Update_Buttons" soit exécuté, cela peut fausser le
comptage des threads terminés. :-(

Je pense que le plus simple est encore de gérer le tout avec un signal.

1°) Ajoutes au DEBUT de ta procédure "EnvoiFichier"

ThreadAttendSignal(infini)

2°) Modifies ton code comme suit:

POUR i = 1 A TableOccurrence(TBL_PLAT)
SI B_MAJ_AUTO[i] = 2 ET B_PROG[i] = 2 ALORS

ThreadExécute("Thread"+i,threadUtiliseHyperFile,"EnvoiFichier",i)
gNbEnvoi++
FIN
FIN

ThreadExecute("Update_Buttons",threadnormal,"Update_Buttons",gNbEnvoi)

// Envoi d'un signal pour débloquer les threads
POUR i = 1 A gNbEnvoi
ThreadEnvoiSignal("Thread"+i)
FIN

A+
Franck

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Publicado el 23,noviembre 2004 - 13:25
Bonjour,

J'ai été un peu rapide. En réfléchissant un peu plus...comme quoi. C'est vrai que la solution de Nico est la meilleure et la plus élégante. D'autant plus que cela marche bien et j'ai déjà eu l'occasion de la mettre en oeuvre sans aucun problème jusqu'à aujourd'hui.

Salutations.