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

Windows Forms Discussion :

Synchroniser la fermeture d'un form avec la fin d'un thread


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 186
    Points : 474
    Points
    474
    Par défaut Synchroniser la fermeture d'un form avec la fin d'un thread
    Bonjour,

    Je souhaite synchroniser l'arrêt de mon application avec la fin effective d'un thread d'execution (lancé par l'utilisateur). Je pensais y mettre quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void OnFormClosed(object sender, FormClosedEventArgs e)
    {
      workThread.Join();
      MessageBox.Show("Bye bye !");
    }
    mais celà pour effet de bloquer complètement mon appli qui fini par planter. (ce qui m'étonne qu'a moitier). Dois-je lancer un nouveau thread pour réaliser cette synchro ?

    D'autres idées ?

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Il fait quoi ton thread ? car s'il sagit d'une boucle tu pourrai créer une variable nommée DoitSarreter par exemple qui tu mettrais à true lors de la fermeture pour que le thread termine son travail et là ta méthode Join marcherait.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 186
    Points : 474
    Points
    474
    Par défaut
    En fait je le fais déjà:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void OnFormClosed(object sender, FormClosedEventArgs e)
    {
      if (!stopped && workThread.IsAlive)
       stopped = true;
       workThread.Join();
       MessageBox.Show("Bye bye !");
      }
    }

    A chaque tour de boucle dans le thread, celui ci vérifie si un break doit être lancé selon l'état du flag "stopped". Par contre le thread en question se charge aussi d'incrémenter la progression d'une barre de progression avec:

    this.Invoke(... incrementeDelegate ...);

    et j'ai remarqué que sans faire d'appel au GUI depuis le thread, le code plus haut fonctionne comme prévu.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 186
    Points : 474
    Points
    474
    Par défaut
    Je commence à analyser ce qui se passe. Le thread d'execution du GUI est bloqué avec l'appel à Join or le deuxieme thread (la tache en cours) tente de mettre à jour un élément du GUI (la barre de progression) et attend la disponibilité du GUI et du coup ... deadlock assuré car chacun attend que l'autre se libère ce qui n'arrivera jamais. Je vais donc plancher sur une autre solution.

    [10 secondes plus tard ...]

    Je teste si la demande d'arrêt du thread n'a pas été déjà demandé avant de solliciter le GUI depuis le thread et là tout fonctionne !

    if (!stopped) {
    // Fait avancer la barre de progression !
    }

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    alors ?

Discussions similaires

  1. [Débutant] WPF window form avec des boutons de réduire et fermeture
    Par midou256 dans le forum C#
    Réponses: 2
    Dernier message: 29/04/2013, 20h20
  2. Fermeture d'une Form avec la croix
    Par arbtec dans le forum C#
    Réponses: 2
    Dernier message: 14/10/2008, 09h25
  3. fermeture de form avec validation
    Par maxland dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/04/2008, 19h35
  4. synchroniser un sous-Form avec un form
    Par maverick91 dans le forum IHM
    Réponses: 1
    Dernier message: 29/11/2006, 10h29
  5. fermeture d' une forme avec AnimateWindow
    Par nopnop dans le forum Delphi
    Réponses: 6
    Dernier message: 05/06/2006, 11h32

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