IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

attendre fin thread avant fermeture application


Sujet :

WinDev

  1. #1
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut attendre fin thread avant fermeture application
    Bonjour à tous,

    Je galère avec mon affaire... qui n'est pas facile à expliquer...

    J'ai un thread (qu'on va appeler Thread0) qui est appelé au démarrage de mon application avec la comande ThreadExecute...
    Celui-ci tourne en boucle toutes les 5 min.

    Il lance 2 autres thread l'un derrière l'autre (Thread1 et Thread2).
    Pour éviter que le 2eme ne se lance avant que le premier finisse, j'utilise les signaux (créés et ouverts dans le code d'init du projet) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SignalModifie("Thread1",signalFermé)
    ExécuteThreadPrincipal("Thread1")
    SignalAttend("Thread1")
     
    SignalModifie("Thread2",signalFermé)
    ExécuteThreadPrincipal(Thread2)
    SignalAttend("Thread2")
    le signal de Thread1 est ouvert à la fin de son traitement, idem pour le Thread2.

    Je souhaite empêcher la fermeture de l'application (via la croix rouge en haut à droite) tant que les 2 thread ne sont pas terminés (si ils sont en cours)

    Pour ce faire,

    Sur l’événement Fermeture de ma fenêtre principale, je fait ouvrir une fenêtre qui dit (patienter blablabla).

    Dans le code de fin d'initiaisation de cette fenêtre, j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SignalAttend("Thread1")
    SignalAttend("Thread2")
    Ferme(FEN_Patienter)
    Et du coup mon application doit donc se fermer quand les Thread se finissent ! où s'ils ne sont pas en cours

    et bien non !!!

    J'explique les cas :

    • Si les Thread ne sont pas cours l'application se ferme = OK
    • Si Thread1 et 2 sont finis alors = OK
    • Si Thread1 est en cours d'execution, alors il attend la fin de Thread1 (super !!) mais thread2 ne démarre pas !
      Donc la fenetre s'ouvre mais ça bloque ??!!
    • Si Thread2 est en cours, la fenetre s'ouvre, mais le Thread2 ne s'arrête pas, et la fenêtre reste ouverte !!??


    J'ai l'impression que qaund je clique sur la croix rouge, cela me tue le Thread0 qui gère le lancement du 1 et 2...


    je galère a essayer avec des debug, trace et autre, mais je ne parviens pas à trouver la bonne méthode.

    Je me demande même si je m'y prends bien...

    Quelqu'un peut m'aider ?

    Merci d'avance !!!

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Ici tu fais signalAttend Thread1, et SignalAttend(Thread2)

    Si thread1 est en cours, SignalAttend(Thread1) attend la fin de Thread1, et SignalAttend(Thread2) attend la fin de thread2 .. mais il manque l'instruction ExécuteThreadPrincipal("Thread2") Donc attente infinie.
    Si thread2 est en cours, alors le programme attend que Thread1 se finisse ... et le message 'Fin de Thread1' n'arrive jamais, donc le programme reste sur la ligne signalAttend(Thread1)

    Il doit y avoir une commande pour dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    si thread1 est en cours  alors 
       SignalAttend(Thread1) 
    fin
     
    Si thread2 est en cours alors 
       SignaAttend(Thread2)
    fin
    Et si il n'y a pas une fonction toute faite pour ça, tu peux passer par des variables globales.
    Tu crées 2 variables globales S1_En_Cours et S2_en_cours
    Au début de ta procédure thread1 , tu mets l'instruction S1_en_Cours=Vrai , et à a fin de cette procédure, tu mets l'instruction S1_en_cours=faux.

    Ainsi, à partir de ton thread principal, tu peux savoir si tel ou tel thread est en cours.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    OUPS pardon je me suis trompé en recopiant le code, voici mon exemple mieux formulé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SignalModifie("Signal1",signalFermé)
    ThreadExecute("Thread1",threadNormal,Thread1)
    SignalAttend("Signal1")
     
    SignalModifie("Signal2",signalFermé)
    ThreadExecute("Thread2",threadNormal,Thread2)
    SignalAttend("Signal2")
    Mais qui ne marche pas mieux.

    ça correspond mieux à ce que tu dis ?

    Le but des signaux de synchro justement est d’éviter que cela passe par des VG !!??

  4. #4
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    j'ai fait un mix de ce que tu me dis,

    c'est dingue ça ! pour m'affranchir des effets indésirables de la croix rouge, j'ai simplement mis ce code dans un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    SI ThreadEtat("Thread1") = threadEnCours ALORS
    	Trace("Thread1",ThreadEtat("Thread1"))
    	SignalAttend("Signal1")
    FIN
    SI ThreadEtat("Thread2") = threadEnCours ALORS
    	Trace("Thread2",ThreadEtat("Thread2"))
    	SignalAttend("Signal2")
    FIN
     
    Trace("fin")
    l’exécution de cette événement me bloque le Thread1 !!?? (visible dans les trace du Thread1) ?????

  5. #5
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    alors j'ai trouvé un truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TANTQUE ThreadEtat("Thread1") = threadEnCours
    	Multitâche(-1)
    FIN
    //SignalAttend("Signal1")
     
    TANTQUE ThreadEtat("Thread2") = threadEnCours
    	Multitâche(-1)
    FIN
    //SignalAttend(Signal2")
    Qui fait ce que je veux ??!! la différence ?? !!

    Mais alors où est l’intérêt d'utiliser les signaux de synchronisation ?????????

  6. #6
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 469
    Points : 121
    Points
    121
    Par défaut
    Autre question :

    Qu'en est-il des fonctions appelées dans un thread ?

    J'entends par là, une simple fonction qui est appelée par ExecuteThreadPrincipal() ???

    Cette fonction devient-elle un Thread elle aussi ? ou elle reste une fonction ???

    par contre si on l'appelle par ThreadExecute(), là elle devient un Thread ! on est d'accord ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Attendre Fin Threads
    Par Drikcé dans le forum Langage
    Réponses: 19
    Dernier message: 28/06/2010, 15h00
  2. Attendre fin thread
    Par PoZZyX dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/05/2010, 15h58
  3. Shell, attendre fin exe avant continuer macro
    Par Yunchi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/02/2009, 15h40
  4. Fermeture application - Erreur thread
    Par b_lob dans le forum C#
    Réponses: 4
    Dernier message: 23/02/2007, 16h47
  5. Réponses: 6
    Dernier message: 27/10/2005, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo