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 :

Modifier un form à partir d'un thread secondaire (MethodInvoker)


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut Modifier un form à partir d'un thread secondaire (MethodInvoker)
    Bonjour,

    Je cherche à faire évoluer une ProgressBar lors du téléchargement d'un fichier.
    Le problème, c'est que je n'ai pas la main sur le téléchargement (je télécharge sur un serveur SFTP en utilisant la librairie SharpSSH).

    Pour faire évoluer ma progressBar, je connais la taille totale du fichier et le nombre d'octet déjà transférer. J'utilise un thread qui toute les demi secondes fait évoluer ma progressBar. Le problème c'est que je ne peux pas modifier ma progressBar directement dans ce thread.

    Voilà 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class InterfacePrincipale : System.Windows.Forms.Form
    {
    ...
     private void BVerifierDonneesFTP_Click(object sender, EventArgs e)
     {
                Thread lThreadTelechargement = null;
                //On lance la vérification
                this.LabelVerification.Text="Téléchargement de l'archive ZIP";
                this.LabelVerification.ForeColor = Color.Blue;
                this.BVerifierDonneesFTP.Text = "Annuler";
     
                 lThreadTelechargement = new Thread(new ThreadStart(this.progressBarEvolution));
                 lThreadTelechargement.Start();
                 //Méthode téléchargant le fichier sur le serveur SFTP
                 this.lVerificationDonneesFTP.telechargement();
                 lThreadTelechargement.Abort();
    ...
     }
    ...
    private void progressBarEvolution()
     {
      Thread.Sleep(500);
       while (this.lVerificationDonneesFTP.enTelechargement)
       {
              Thread.Sleep(500);
               this.BeginInvoke((MethodInvoker)delegate
               {
                        this.PBTempsVerification.Value = (int)((this.lVerificationDonneesFTP.getQuantiteTelecharge() / this.lVerificationDonneesFTP.getTailleTotale()) * 100);
                 });
        }
     
     }
    Bien sur ça ne fonctionne pas!

    Je pense que le problème vient de l'utilisation du "MethodeInvoker". J'ai saisie l'utilité mais pas vraiment le fonctionnement.

    Si quelqu'un pouvait m'éclairer un peu ça serait sympa.

    Merci d'avance

    Cordialement,
    Denethor9

  2. #2
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Bonjour,

    Il est tout a fait normal que tu ne puisse pas le faire, on ne peut atteindre un objet créer dans le thread concernant la form, ou il est assez difficile de le faire car il faut attendre que le thread te laisse la main.
    Pour résoudre ces problème Microsoft a créer un objet : le backgroundworker qui permet de résoudre les problèmes auxquels tu t'oppose.
    Un tuto est dispo sur le site je te conseil sa lecture :
    http://glarde.developpez.com/dotnet/bgworker/cs/


    très cordialement

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut
    J'ai déjà essayé avec le backgroundWorker, mais le problème c'est que ce n'est pas possible dans mon cas de définir des étapes pour faire évoluer la ProgressBar. J'aurais voulu pouvoir télécharger le fichier grâce à un flux qui lit octet par octet, dans ce cas à chaque lecture j'incrémente ma progressBar, mais je ne peux le faire, je n'ai pas accès à cette partie du code.

    Désoler j'ai un peux (voir beaucoup) de mal à exprimer mon problème.
    Je vais réessayer tout ça à tête reposée, et si je bloque toujours je re-posterai demain. Si je trouve une solution je la déposerai aussi.

    Merci de ton aide en tout cas worm83!

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bonjour l'une des facon de faire est d'ajouté a ta form une methode qui ressemblerai a ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private delegate void ProgessInvoke(int);
     
    private void UpdateProgressBar(int increment)
    {
        if (Invokerequired)
        {
            BeginInvoke(new ProgessInvoke(UpdateProgressBar), new object[] {increment});
        }
     
        //traitement classique pour mettre a jour la progressbar
    }
    Edit:
    worm83 a raison, vu ton cas il vaut utiliser un BackgroundWorker

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut
    Bonjour,

    La nuit porte conseil! J'ai trouvé une solution qui fonctionne parfaitement.
    J'utilise en fait 2 BackgroundWorker. Le premier qui s'occupe de mon téléchargement (sans utiliser l'évènement ProgressChanged) et un deuxième pour ma ProgressBar qui s'endort 1/2 seconde puis lève un évènement ProgressChanged pour actualiser ma progressBar.
    Du coup mon interface graphique n'est pas figé et je peux continuer à faire d'autres opérations.


    Merci pour votre aide en tout cas!

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

Discussions similaires

  1. Récupérer un objet à partir d'un thread secondaire
    Par EyeRobot dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/12/2013, 13h04
  2. Réponses: 4
    Dernier message: 02/12/2013, 11h54
  3. suspendre thread vcl à partir d'un thread secondaire
    Par omen999 dans le forum Langage
    Réponses: 3
    Dernier message: 25/06/2009, 13h42
  4. [C# 2.0] Comment ouvrir plusieurs form à partir d'un thread
    Par Sidi-Bou dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/10/2008, 12h25
  5. [C#] Modifier mes Forms a partir de Class
    Par folk dans le forum Windows Forms
    Réponses: 12
    Dernier message: 01/08/2006, 17h54

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