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 Presentation Foundation Discussion :

[Thread]faire en sorte que l'UI ne freeze pas


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut [Thread]faire en sorte que l'UI ne freeze pas
    Bonjour,

    je cherche à afficher une progressBar qui indique qu'un calcul est en cours.

    Pour ça j'utilise les threads et mon calcul se fait bien, l'UI ne freeze pas, je peux faire ce que je veux pendant l'exécution du calcul sur l'autre thread.

    Mais ! oui, il y a un "mais" ... J'ai un problème. Comme dit au début, je n'arrive pas à afficher ma progressBar et empêcher que l'UI bloque un bouton.

    Le bouton est celui sur lequel l'utilisateur clic pour lancer le calcul.

    Voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
            void threadA()
            {
                linq.Invoke();
            }
     
            void calcul()
            {
                //calcul
            }
     
            private void button3_Click(object sender, RoutedEventArgs e)
            {
                progressBar1.Visibility = Visibility.Visible; //
                button3.IsEnabled = false;
                linq = new T(calcul);
                Tread_test_linq = new Thread(new ThreadStart(threadA));
                Tread_test_linq.IsBackground = true;
                Tread_test_linq.Start();
                //Tread_test_linq.Join();
                progressBar1.Visibility = Visibility.Hidden;
                button3.IsEnabled = true;
            }
    Alors moi je vois pourquoi la progressBar n'apparait pas (enfin je pense)
    Ça serait parce-que le thread courant se termine bien avant que le thread calcul se termine.

    Donc je dois trouver un moyen de faire attendre dans cette fonction que le thread s'occupant du calcul se termine.

    J'ai testé avec un "join", ça marche pour le bouton qui est "disable" durant le calcul mais on ne voit pas la progressBar (car on dirait que ça freeze, du moins on ne pas peut utiliser l'UI)

    Avez-vous des idées pour me mettre sur la voie s'il vous plait ?

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Join entraine le freeze car tu bloques le thread responsable de redessiner l'UI. Appelle Visibility.Hidden juste après ton linq.Invoke, via un appel du Dispatcher afin de traiter cet appel dans le thread de l'UI.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void threadA()
            {
                linq.Invoke();
                 this.Dispatcher.Invoke(new Action(() =>  {  progressBar1.Visibility = Visibility.Hidden; button3.IsEnabled = true;
      }));
            }

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    OMG ! Arnard, merci beaucoup,

    je vais aller lire des articles sur le dispatcher car je le connais trop peu apparemment

    Merci encore, un sujet vite clos

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/02/2011, 09h51
  2. [Snow Leopard] Comment faire ne sorte que mes utilisateur n'aie pas le droit administrateur
    Par pierrot10 dans le forum Apple
    Réponses: 1
    Dernier message: 18/10/2009, 22h15
  3. Réponses: 1
    Dernier message: 03/03/2009, 23h09
  4. Réponses: 3
    Dernier message: 17/05/2007, 19h30
  5. Réponses: 4
    Dernier message: 02/09/2006, 19h41

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