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 :

[C#] Thread et treeviews


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut [C#] Thread et treeviews
    Bonjour,

    Je développe une sorte de client FTP. Les fichiers/dossiers distants sont listés dans un treeview. Lorsque l'utilisateur clique sur un noeud, l'appli cherche les noeuds enfants sur le serveur (les sous-répertoires).

    Je voudrais, le temps de l'attente, mettre une progressBar. J'avais eu l'idée de lancer un thread pour animer cette progress bar le temps que le serveur FTP réponde.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(avance));
    t.Priority = System.Threading.ThreadPriority.Normal;
    t.Start();
     
    //traitement pour récupérer les infos sur le serveur FTP
    ...

    Pourtant le thread commence à s'exécuter seulement après la récupération de toutes les infos, donc aucun intérêt.

    J'ai donc essayé de lancer deux threads en parallèle
    * un pour la progressBar
    * un autre pour la requete ftp

    Là, le thread de la progressBar démarre immédiatement.

    En revanche, je ne peux pas passer d'argument (le noeud sur lequel on a cliqué). Une FAQ developpez http://emerica.developpez.com/csharp/threads/ indique qu'il faut créer une nouvelle classe mais si je fais ceci, le n'aurai plus accès au treeview pour y ajouter des noeuds.

    Dernier contournement :
    J'ai créé une variable globale de type TreeNode auquel j'affecte le noeud sur lequel j'ai cliqué puis je lance le thread (pas propre mais c'est pour tester).

    Ainsi, la méthode invoquée a bien le noeud sur lequel j'ai cliqué. En revanche, lorsque je veux lui affecter des noeuds enfants, j'ai cette exception :

    L'action effectuée sur ce contrôle est appelée à partir d'un thread incorrect. Vous devez marshaler le thread correct en utilisant Control.Invoke ou Control.BeginInvoke pour effectuer cette action.

    Comment puis-je solutionner ce problème ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 66
    Par défaut
    Tu devrais faire l'inverse :
    le traitement sur le serveur FTP dans le thread que tu crée et mettre a jour la progressbar dans le thread courant.

    Cela viens du fait que tu ne peux modifier des éléments graphique tel qu'un progressbar que sur le thread qui l'a créé.

    Sinon je te conseil d'aller voir du coté de la classe BackgroundWorker qui sert justement à gérer un traitement asynchrone. Elle supporte l'indication de la progression du job qui est fait dans le thread.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    Merci beaucoup pour ta réponse.
    Je teste ces solutions et reviens pour te dire si c'est OK.

    A bientôt.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    J'ai commencé par rechercher du côté de BackGroundWorker.
    Si je me fie à cette doc http://glarde.developpez.com/dotnet/bgworker/cs/, ce composant n'est apparu qu'avec le framework 2.0. Mais je suis toujours avec VS2003 et le framework 1.1

    Enfin, si je fais l'inverse, le traitement FTP se fait toujours dans un thread et l'ajout de noeuds est donc également dans le thread, pas dans le thread courant.

    En java, je m'en étais sorti avec SwingUtilities.invokeAndWait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    new Thread(new Runnable() {
                public void run() {
                    final boolean succes = traitement();
     
                    SwingUtilities.invokeAndWait(new Runnable() {
                            public void run() {
                               LabelEtat.setText(succes ? "Terminé" : "Transfert échoué");
                               enableAll(true);
                            }
                    });
                }
            }).start();
    Existerait-il un équivalent en .NET ?

    Merci

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Par défaut
    Salut,
    Bien sûr il existe les methode delagate
    MSDN : Delagate method and Invoke

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 277
    Par défaut
    Merci,

    Je me suis basé sur cette doc pour me servir des delegate :
    http://drq.developpez.com/dotnet/articles/threads/#L6
    paragraphe 5.1

    Je fais ceci :

    Code C# : 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
    24
    25
    26
    27
    28
    29
    30
     
    // Déclaration du délégué nécessaire à la mise à jour
    private delegate void TreeViewDelegateHandler(TreeNode node);
    private TreeViewDelegateHandler TreeViewDelegate;
     
    ...
     
    public Constructeur(){
            ...
    	// Sur appel du délégué, la méthode UpdateProgressBar est donc appelé
    	TreeViewDelegate = new TreeViewDelegateHandler(recherche);
    }
     
     
    private void recherche()
    {
            ...
    }
     
    private void ThreadProcess() 
    {
    	this.Invoke(this.TreeViewDelegate,new object[] {test});
    }
     
    private void DirectoryTree_AfterExpand(Object sender, TreeViewEventArgs e) 
    {
    	System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProcess));
    	t.Start();
            ...
    }

    comme la doc. Pourtant, j'ai cette erreur :
    Method 'Form.recherche()' does not match delegate 'void Form.TreeViewDelegateHandler(System.Windows.Forms.TreeNode)'

    Est-ce que vous pourriez m'éclairer parce que je ne comprends pas la différence avec la doc ?

    Merci d'avance.

  7. #7
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Le delegate prend un TreeNode en parametre et ta fonction ne recherche ne prend rien. Il faut que le méthode suit la signature du delegate pour que ça fonctionne

Discussions similaires

  1. Treeview et Thread
    Par crocteamgg dans le forum C#
    Réponses: 13
    Dernier message: 30/01/2013, 19h51
  2. Mise à jour TreeView à partir de différents thread
    Par 1234567890 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/07/2009, 10h40
  3. Remplir une treeview dans un nouveau thread
    Par vaxxx dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/12/2008, 15h44
  4. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  5. [C#] Thread et Treeview
    Par Royd938 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 02/12/2005, 10h40

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