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

C# Discussion :

Mettre en pause le thread principal en gardant disponible le thread graphique?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 25
    Par défaut Mettre en pause le thread principal en gardant disponible le thread graphique?
    Bonjour à tous,

    J'ai un problème de mise en place de la synchronisation de mes threads. Auparavant j'avais des fonctions qui s'exécutaient à la chaîne dans le thread principal, ou thread graphique. Cela figeait l'interface.

    Maintenant j'ai passé une fonction de chargement de fichiers (LoadFile) dans un thread afin d'afficher des informations lors du chargement (étape en cours...).

    Le problème est que les fonctions qui s'exécutent après "LoadFile" manipulent des objets créés par cette même fonction. Il me faut donc mettre en pause ma tâche principale pour attendre que la fonction se termine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Main(..)
    {
    ...
     
    Thread loadingThread = new Thread (ParametrizedStartParameterizedThreadStart(LoadFile))
    loadingThread.Start(filePath);
     
    //Là où il faudrait faire une pause
    //myWaitHandle.WaitOne();
    ...
     
    //Fonctions qui utilisent les objets créés par LoadFile
    }
    Le problème est que ma fonction LoadFile fait des mises à jour graphiques, l'interface graphique se trouvant dans la même classe que LoadFile(et pas dans le main mais j'ai voulu simplifier...).
    J'ai essayé de faire une pause avec une WaitHandle, dont je passe le Set() à la fin de LoadFile, mais je ne sais pas pourquoi, tout se met en pause !
    Le thread principal étant en pause, je pense que mes appels au Dispatcher pour faire les mises à jour graphiques sont vains, car il est en pause...

    Comment pourrais-je faire pour que mon thread principal attende la fin de LoadFile avant de continuer, tout en restant disponible pour effectuer des mises à jour graphiques, et sans tout bloquer?

    Vraiment merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Hello,

    A priori, la meilleure façon de faire serait de déplacer tout ton code qui dépend du fichier dans le thread qui s'occupe de la charger. Tout autre solution reviendrait à bloquer l'affichage de ta fenêtre.

    En général, quand à besoin de faire appel au Dispatcher "à la main", c'est qu'on est parti dans la mauvaise voie...

    A+!

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 25
    Par défaut
    Salut, merci pour ta réponse.

    Je vais donc essayer de mieux reprendre l'architecture du programme afin de libérer le thread principal.

    Quand tu dis qu'il ne faut pas utiliser le dispatcher, tu veux dire qu'il vaut mieux utiliser des évènements qui s'exécutent dans "l'interface graphique"? C'est à dire des évènements qu'on lance et qui seraient "codés" en dehors du thread?

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 25
    Par défaut
    Effectivement il semble qu'on ne met pas en pause le thread principal. Grâce au débogueur multi-thread (version payante de VS) j'ai pu voir que mon thread principal n'était pas libre, mais il attendait toujours en fond.

    Je l'ai libéré jusqu'à avoir pour son état : "[transition managé à natif]", ce qui doit vouloir dire qu'il attend et est dispo.

    Merci beaucoup, j'espère que ca pourra être utile à d'autres.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/07/2012, 09h30
  2. Mettre le thread principal en attente
    Par luffydu22 dans le forum Multithreading
    Réponses: 5
    Dernier message: 07/12/2010, 10h36
  3. Comment mettre en Pause une Thread et la relancer?
    Par Hellik dans le forum VB.NET
    Réponses: 6
    Dernier message: 14/07/2009, 13h28
  4. Ralentir ou mettre en pause des threads
    Par Nalfeim dans le forum Mobiles
    Réponses: 0
    Dernier message: 19/08/2008, 12h36
  5. [BOOST] Mettre en pause un thread
    Par Groove dans le forum Boost
    Réponses: 3
    Dernier message: 24/02/2007, 12h34

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