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 :

attendre fin d'un thread sans bloquer le main thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut attendre fin d'un thread sans bloquer le main thread
    Bonjour.

    Dans mon thread principal, il y a une pompe à message qui gere ma fenetre principale.

    Je suis dans ce thread, et lance un second thread qui effectue un travail assez long. Ce second thread etant pour ne pas figer ma fenetre principale...

    Ce que je voudrait faire :
    bloquer la methode qui a lancé ce 2nd thread, sans pour autant figer ma pompe à message.

    Existe t'il un moyen propre, autre que le code ci dessous pour y parvenir?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do
    {
    Thread.Sleep(1);
    }while(thread.IsAlive); //Bidouille pour bloquer le block en cours sans freeze de la pompe à message

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Essaye plutôt avec un BackgroundWorker. C'est plus facile à utiliser, et il y a un évènement lorsque le travail est fini.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    C'est ce que j'envisage en effet, mais je me demandais si il n'y avait pas une solution pour rester dans la methode qui lance le thread plutot que basculer dans une callback...

    J'avous m'y perdre un peu sur le fonctionnement de la pompe à message, il ne faut pas la bloquer, mais en meme temps quand une methode du main thread s'execute on est cencé la bloquer... c'est un paradoxe que je n'arrive pas à saisir.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    une méthode sur le main thread ne doit tout simplement pas durer plusieurs de quelques centaines de millisecondes pour être tranquille (et ne pas embêter l'utilisateur)

    si tu veux tricher, tu peux utiliser system.windows.forms.application.doevents dans ta boucle, qui a pour effet de traiter les évènements en attente avant de revenir à la ligne suivante de l'appel à doevents
    ca ne fige donc pas l'interface tout en permettant de continuer une méthode après une attente
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Sinon, si tu es courageux, tu peux essayer avec le Async Framework (http://msdn.microsoft.com/fr-fr/vstudio/async) Il y a une licence Go-Live. C'est toujours expérimental. Mais ça simplifie tellement la vie!

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Juste un mot pour vous remercier de vos réponses.

    Apres reflexion, je vais utiliser le background worker que je vais coupler à une pseudo FSM. beaucoup de cas de figure etant possibles, à chaque fois avec le besoin de lancer un thread différent (un thread à la fois en plus du principale); ils feront des invokes sur ma form au besoin...

    Merci pour l'astuce de application.doevents ca me servira un de ces quatres, mais comme je m'attaque à un gros morceau, je crains des effets de bord.

    Quand à Async Framework j'utilise VS2008 Framework 3.5 donc...

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    Merci pour l'astuce de application.doevents ca me servira un de ces quatres, mais comme je m'attaque à un gros morceau, je crains des effets de bord.
    tu as bien raison, DoEvents sous vb6 avait en effet des effets de bord, genre cliquer pour fermer le form traité dans le laps de temps du doevents, une fois revenu dans la méthode on se retrove à lire des variables détruites
    ca peut servir pour bricoler ou pour des petites choses, mais c'est à éviter pour des gros morceaux
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. RuntimeError: main thread is not in main loop
    Par bender86 dans le forum GTK+ avec Python
    Réponses: 0
    Dernier message: 30/07/2011, 12h21
  2. Réponses: 8
    Dernier message: 18/07/2010, 21h16
  3. Attendre Fin Threads
    Par Drikcé dans le forum Langage
    Réponses: 19
    Dernier message: 28/06/2010, 15h00
  4. Attendre fin thread
    Par PoZZyX dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/05/2010, 15h58
  5. [QThread] Main thread qui bloque un autre thread
    Par Amnell dans le forum Multithreading
    Réponses: 6
    Dernier message: 25/02/2010, 15h38

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