|
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. |
| |
| |
| | | |
|
| | | | |
| | |
|