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 :

Débutant : Comment afficher un texte pendant une recherche récursive?


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Débutant : Comment afficher un texte pendant une recherche récursive?
    Toutes mes excuses pour le message précédent tronqué.
    Dans un programme C# utilisant WPF:
    J'ai une méthode appelée "resolution" , lancée par un menu, qui recherche de façon récursive la solution à un problème.
    Cette recherche durant quelques minutes, je souhaite pendant celle-ci afficher un texte "recherche en cours".
    J'ai tout simplement posé un label invisible contenant le texte, et je pensais facile de le rendre visible pendant la recherche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void MenuResoudre_Click(object sender, RoutedEventArgs e)
    {
    label3.Visibility = Visibility.Visible;
    resolution();
    }
     
    private void resolution()
    { 
    // algorithme récursif
    }
    Or le label ne devient pas visible quand on lance la recherche en cliquant sur menu, mais il attend pour devenir visible , que la méthode résolution soit terminée !!
    Comment faire simplement, sans passer par le multithreading ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 141
    Points : 12 242
    Points
    12 242
    Par défaut
    Comment faire simplement
    Avec le multithreading.
    C'est vraiment mais vraiment très simple dans ce cas de figure.
    Vous lancez un thread qui appel la méthode "resolution" vous déclencher un évènement à la fin de la méthode et c'est tout.

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Je n'ai pas encore d'experience en WPF mais en winform, simplement en faisant un refresh de ta form ou de ton label avant de lancer resolution !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    essaie d'appeler la méthode UpdateLayout() de ton contrôle.

  5. #5
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    As-tu essayé un DoEvents entre les deux ?

    Le DoEvents n'existe plus en WPF, mais il y a des équivalents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Code equivalent de l'Application.DoEvents()
    Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new ThreadStart(delegate { }));
    Louis .NET

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Merci
    Merci beaucoup à tous des réponses. Je suis passé effectivement par le multithreading, qui n'est finalement pas si compliqué (après une heure d'exercices dans tous les sens sur la console). C'est même assez magique!! Ca marche très bien, sauf que maintenant, je tombe sur une autre difficulté: la mise à jour de l'interface graphique qui est impossible à partir d'un thread autre que le principal. Du coup, j'essaie de comprendre la méthode Dispatcher.Invoke . Pas très simple, mais ça avance... Finalement, à partir d'un petit problème d'affichage, j'aurai beaucoup appris... A la prochaine

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    pour revenir sur le thread principal en wpf, c'est plutot simple, voici le code (traduit du vb.net)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void a()
    {
      if (!object.ReferenceEquals(Windows.Threading.Dispatcher.CurrentDispatcher, Application.Current.Dispatcher))
      {
        action d = new action(a);
        Application.Current.Dispatcher.Invoke(d);
        return; 
      }
      //Traitement ici !
    }
    en fait on test si le dispatcher actuel qui exécute le code est le dispatcher principal
    si c'est pas le cas, on invoke sur le dispatcher principal un délégué
    et dans mon cas, le délégué pointe vers le même void, donc on retombe au même endroit, mais ce coup si le if retourne false, donc ca fait le traitement (le return sert à ne pas faire le traitement si on est pas sur le bon thread, le convertisseur dit que la traduction est peut etre pas bonne, en vb c'était exit sub)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Résolu
    C'est vrai qu'il y a beaucoup de façons d'y arriver.
    J'ai trouvé une explication très claire sur
    http://www.microsoft.com/france/visi...0-ae7450baba0b

    pour mettre à jour un contrôle (ici label1) à partir d'un thread:

    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
     
     
      private delegate void MAJlabelHandler(int i);
     
      private void MAJlabel(int i)
            {
                label1.Content = i;
            }
    // et dans le thread
    ThreadPool.QueueUserWorkItem(delegate
    {
    // ..........
    label1.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
                            new MAJlabelHandler(MAJlabel), i);
    //......
    });
    Je n'ai plus qu'à l'adapter à mon problème, ce qui ne sera plus long.
    Encore merci à tous.

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

Discussions similaires

  1. Comment afficher un texte d'une base de données
    Par Anonyme5571 dans le forum NodeJS
    Réponses: 2
    Dernier message: 06/02/2015, 16h53
  2. Comment afficher un texte dans une div au survol d'un lien menu ?
    Par ryohazuki100 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 07/12/2014, 13h38
  3. [Débutant] comment afficher un text dans une form
    Par frederic_lh dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/03/2010, 20h10
  4. Réponses: 4
    Dernier message: 08/05/2006, 20h12
  5. Réponses: 1
    Dernier message: 17/02/2006, 19h18

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