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 :

form1 thread - le paralisme de la fenetre


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Par défaut form1 thread - le paralisme de la fenetre
    bonjour
    je sais qu'il a beaucoup des sujets qui se ressemblent à ma question mais je pige rien et là je veux poser ma question, j'espere que quelqu'un va m'aidé :

    bon je veux uploader un fichier .img ou .exe... dans un ftp, mon code fait correctement ce que je veux mais parfois la taille de mon fichier est assez grande 2Mo... ce qui paralise complètement ma form1.

    j'ai pense qu'un thread peut faire l'affaire mais je n'est pas reussi, j'ai meme ajouter une progresse bar pour suivre quelque idée dans le forum mais je n'est pas reussi.

    voici 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
            private void progressbarupload()
            {
     
                try
                {
     
                    while (this.progressBar1.Value < this.progressBar1.Maximum)
                    {
                        bytesSize = stream.Read(buffer, 0, buffer.Length);
                        reqStream.Write(buffer, 0, bytesSize);
                        longeur += 1;
                        this.progressBar1.Value = longeur;
                        this.Update();
     
                    }
                    reqStream.Close();
                    stream.Close();
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show("ne veut pas\n" + ex.Message, "Erreur d'upload", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
     
     
            }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
           private void button2_Click(object sender, EventArgs e)
            {
                Thread thread_ecriture = new Thread(new ThreadStart(progressbarupload));
                thread_ecriture.IsBackground = true;
                thread_ecriture.Priority = ThreadPriority.Highest;
     
                //region Démarrer l'écriture
                thread_ecriture.Start();
    }
    lorsque je clique le fichier ne peux s'uploader alors il se passe dans l'exception, mais si j'enleve le thread et je vais seulement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           private void button2_Click(object sender, EventArgs e)
            {
                progressbarupload();
    }
    la form1 ce paralise mais le fichier se upload sans aucun probleme.

    ma question est ce que je peux faire un thread pour ma form1 ? sinon comment résolut mon problème.

    merci avance

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    Bonjour

    Visiblement je croix que l'exception que t'as c'est de type InavliadOperation avec le message : Opération inter-threads non valide si je me rappel bien.

    L'explication de probléme est que tout simplement un thread (thread_ecriture) essaye d'accéder aux éléments d'un autre thread.

    Essaye donc de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         private void button2_Click(object sender, EventArgs e)
            {
                Thread thread_ecriture = new Thread(new ThreadStart(progressbarupload));
                thread_ecriture.IsBackground = true;
                thread_ecriture.Priority = ThreadPriority.Highest;
     
                //region Démarrer l'écriture
                thread_ecriture.Start();
    }
    déclare ensuite un delegate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Private Delegate void MAJProgressBarDelegate(Int index)

    aprés une fonction qui va mettre a jour la valeur dans le progresse bar :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private void MAJPb(Int index)
     
            If (progressBar1.InvokeRequired) {
     
                LabelValeur.Invoke(New MAJProgressBarDelegate(MAJPb), index)
                Return
     
            }
            progressBar1.Value = index
     
    }
    et finalement l'appel depuis ton 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
            private void progressbarupload()
            {
     
                try
                {
     
                    while (this.progressBar1.Value < this.progressBar1.Maximum)
                    {
                        bytesSize = stream.Read(buffer, 0, buffer.Length);
                        reqStream.Write(buffer, 0, bytesSize);
                        longeur += 1;
     
     MAJPb (longeur);
                    }
                    reqStream.Close();
                    stream.Close();
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show("ne veut pas\n" + ex.Message, "Erreur d'upload", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
     
     
            }

    Bon j'espére que ça va résoudre ton problème

  3. #3
    Membre très actif
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Par défaut
    salut
    j'ai deja essaye cette methode mais sans If (progressBar1.InvokeRequired) et j'etais toujours dans le probleme.
    enfin mon probleme est regler mais j'aimerai que tu m'explique ce que InvokeRequired fait.


    autre chose, j'ai ajouté ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                finally
                {
                    this.Close();
                }
    apres l'exception je veux que mon programme ce ferme, helas un message d'erreur me dit :

    Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
    je pense qu'il faut faire ça a travers du thread mais je ne sais pas comment faire

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Y'avait plus simple: la classe BackgroundWorker est particulièrement bien adaptée dans ton cas.

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/07/2007, 18h13
  2. Réponses: 7
    Dernier message: 03/05/2006, 16h13
  3. [Debutant] Un thread qui dessine sur une fenetre ???
    Par Spartan03 dans le forum OpenGL
    Réponses: 6
    Dernier message: 05/04/2006, 20h19
  4. Fenetre modale | Des threads en javascript ?
    Par siddh dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/11/2005, 12h06
  5. [Thread] laisser une fenetre s'afficher
    Par parisjohn dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 25/08/2004, 15h05

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