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 :

ProgressBar avec transfert des données


Sujet :

C#

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Points : 46
    Points
    46
    Par défaut ProgressBar avec transfert des données
    Bonjour,

    j'ai besoin de votre aide, la j'envoie des données via un port série et je voudrais ajouter une progressBar Pour voir l'a progression des données pendant l'envoi.
    j'ai essayé avec un timer mais ça se déclenche toujours après l'envoie.
    voila mon code, je charge les données dans str puis les envoyer :
    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
    31
    32
    public string str;
    public string i;
     
           private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
     
                if (str.Length > 0)
                {
                        int max = 50;
                        string don;
                        //int nboucle = 0;
     
                    if (i < str.Length - (str.Length % 50))
                    {
     
                        don = str.Substring(i, 50);
                        serialPort1.Write(don);
                        i += 50;
     
                       //progressBar1.Value = (nboucle*100 / str.Length);
                       //toolStripStatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Transférés...";
                    }
     
                    else
                    {
                        max = str.Length % 50;
                        don = str.Substring(i, max);
                        serialPort1.WriteLine(don);
                        toolStripStatusLabel1.Text = "Transfert Fini";
                    }
                }
            }

    pouvez-vous m'aider :calim2

  2. #2
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Points : 46
    Points
    46
    Par défaut
    bonjour,
    j'ai essayé ce petit code mais les compteur ne décrémente pas

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                int compteur = 0;
                int compeur1 = 0;
                progressBar1.Value = 0;
     
     
     
                if (str.Length > 0)
                {
     
                        int max = 50;
                        string don;
                         compteur++;
     
                    if (i < str.Length - (str.Length % 50))
                    {
     
                        don = str.Substring(i, 50);
     
                        serialPort1.Write(don);
                        i += 50;
                        compeur1++;
                        progressBar2.Value = compeur1 * 100 / compteur;
                        toolStripStatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Télechargement en court...";
                       //progressBar1.Value = (nboucle*100 / str.Length);
                       //toolStripStatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Transférés...";
                    }
     
                    else
                    {
                        max = str.Length % 50;
                        don = str.Substring(i, max);
                        serialPort1.WriteLine(don);
                        //toolStripStatusLabel1.Text = "Transfert Fini";
                    }
     
                }
     
            }

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut, outre ton problème de code je me permets de te faire quelques remarques pour avancer.
    Je pense que personne ne poste (moi le premier) car pour arriver à un résultat propre il y a un gros bout de chemin à faire. J'ai fait tout le code mais ça ne serait pas te servir que de te le donner comme ça.
    Libre à toi de 'bidouiller un truc' mais si tu as du temps et l'envie d'apprendre voila quelques étapes pour coder ce que tu veux "d'une bonne manière" qui te servira dans tous tes programmes.
    • On ne code pas directement dans une classe Form une logique de lecture écriture sur port série. Ou quoi que ce soit qui est externe au graphisme. Il faut découper ton code. Fais toi une classe PortSerie avec une méthode d'ouverture, fermeture, lecture, écriture, une callback à l'événement DataReceived et un événement OnTrameRecue qui relais les données de cette callback. Puis tu places un objet de port série dans ta classe formulaire.
    • Sur ton formulaire une textbox + un bouton; dans la tb tu marques à minima le nom du port com et derrière le clic du bouton tu places ton code port.Ouverture(tb.Text);
    • Sur ton formulaire une autre textbox + un bouton; dans la tb tu marques le texte à envoyer et derrière le clic du bouton tu places ton code port.Envoyer(tb2.Text);
    • Dans ta classe port série tu ajoute un événement TransmissionEnCours(int index). Dans le constructeur de ta form tu t'abonnes à cet événement. Index est le nombre d'octets envoyé.
    • Dans ta méthode envoyer dans le port série tu fais ta boucle avec ton "max" (plutôt renommé tailleTampon) et tu découpe ton string en paquet de 'max' et à chaque fois tu appelles l'événement TransmissionEnCours(indexActuel) avec ton index actuel.
    • Dans le code du bouton 2 tu configures ta processbar :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      pb.Value = 0; 
      pb.Maximum = tb2.Text.Lenght;
      et tu envoies la trame :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      port.Envoyer(tb2.Text);
    • Dans la callback TransmissionEnCours (dans ton formulaire) tu fais simplement l'incrémentation de ta processbar.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
       
      pb.Value = index;
      pb.Refresh(); //Pas forcément nécessaire

    • Sache aussi que tu as la méthode Write(byte[]) de port série; plutôt que d'utiliser WriteLine(string). Il suffit juste de transformer ton string en UTF8 pour l'envoyer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      byte[] trame = ASCIIEncoding.UTF8.GetBytes("ma chaine");
      Et le code de réception pour repasser en "string":
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      string trame = ASCIIEncoding.UTF8.GetString(new byte[] {100, 100, 255 });
      Ça évite dans ton cas d'envoyer des retour à la ligne en plein milieu d'une phrase par exemple. Car dans ton code chaque 50car tu as un retour à la ligne pour le destinataire.


    Voila; ça n'a pas vocation à être parfait. C'est juste une manière de faire. Il y en a 'n' autres. Celle là est assez propre et maintenable. Si tu arrives à faire ça on parlera des problèmes que tu as pour ton index et le découpage de ta string ainsi que de l'affichage sur ton formulaire des données reçues sur ton port.

    A+

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 131
    Points : 46
    Points
    46
    Par défaut
    merci bien pour le retour et les conseilles.

    j'ai réussi à faire un bout de code qui permet de charger les données sur mon pc et les envoyer via un port série vers un automate qui est programmer pour récupéré les données de 50 caractère puis un retour à la ligne jusqu'à la fin des données.
    voila tout le 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    using System.Threading;
     
     
     
    namespace Communication_MCS
    {
        public partial class Pc_mcs : Form
        {
            public byte[] bBufferBytes; //buffer a envoyer
            public bool dataIsReceived = false;
            public string str;
            public int i=0;
     
     
            public Pc_mcs()
            {
                InitializeComponent();
                this.Refresh();
            }
     private void button_connecter_Click(object sender, EventArgs e)
            {
                serialPort1.PortName = portBox1.SelectedItem.ToString();
                serialPort1.BaudRate = 9600;
                serialPort1.DataBits = 8;
                serialPort1.Parity = Parity.Even;
                serialPort1.StopBits = StopBits.One;
     
                serialPort1.Handshake = Handshake.None;
                serialPort1.PortName = portBox1.Text;
     
              serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                try
                {
                    serialPort1.Open();  //Ouvrez le SerialPort                
     
                    toolStripStatusLabel1.Text = "le port série : " + portBox1.Text + " Opened";//Mettre à jour le StatusStrip
                    MessageBox.Show("Opened");
     
     
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Failed: " + ex.Message);
                }
     
                button_connecter.Enabled = false;
                button_deconnecter.Enabled = true;
                button_charger.Enabled = true;
                button_envoyer.Enabled = true;
            }
     
            private void Pc_mcs_Load_1(object sender, EventArgs e)
            {
                //on commence par lister les voies séries présentes
                String[] ports = SerialPort.GetPortNames();//l'événement Form_Load nous lire tous les ports série disponibles et nous assigner les valeurs à la liste déroulante.
                //string[] ports = System.IO.Ports.SerialPort.GetPortNames();
                for (int i = 0; i < ports.Length; i++) //on ajoute les ports au combo box
                {
                    portBox1.Items.Add(ports[i]);
                }
            }
     
     
     private void button_charger_Click(object sender, EventArgs e)
            {
     
                textBox1.Text = string.Empty; // On vide le TextBox
                openFileDialog1.Title = "Chargement";// Titre
                openFileDialog1.FilterIndex = 1;
     
                toolStripStatusLabel1.Text = "Chargement en cours...";
     
                if (openFileDialog1.ShowDialog(this) == DialogResult.OK) // Ouverture boite de dialogue OpenFile
                { 
                    StreamReader sr = new StreamReader(openFileDialog1.OpenFile(), Encoding.Default); // Ouverture du fichier sélectionné
                    // son nom est dans openFileDialog1.FileName
                    char[] tab = new char[100];
                    str = string.Empty;
     
                    str = sr.ReadToEnd();
                    textBox1.AppendText(str + "\r\n");
                    timer1.Start();
     
                }
            }
     
            private void button_envoyer_Click(object sender, EventArgs e)
            {
                toolStripStatusLabel1.Text = "Appuyez sur 'F6' de la commande numérique puis patientez...";
     
                char[] B = { (char)'\u000A' };// lancer la tache recvfil
                serialPort1.Write(B, 0, 1);
            }
         private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //int compteur = 0;
                //int compeur1 = 0;
                //progressBar1.Value = 0;
     
     
                    if (str.Length > 0)
                    {
     
                        int max = 50;
                        string don;
                        //int nboucle = 0;
     
                        if (i < str.Length - (str.Length % 50))
                        {
     
                            don = str.Substring(i, 50);
     
                            serialPort1.Write(don);
                            i += 50;
                            toolStripStatusLabel1.Text = "Télechargement en court...";
     
                            //compeur1++;
                            //progressBar2.Value = compeur1 * 100 / compteur;
                            //toolStripStatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Télechargement en court...";
                            //progressBar1.Value = (nboucle*100 / str.Length);
                            //toolStripStatusLabel1.Text = progressBar1.Value.ToString() + "%" + "Transférés...";
                        }
     
                        else
                        {
                            max = str.Length % 50;
                            don = str.Substring(i, max);
                            serialPort1.WriteLine(don);
                            //toolStripStatusLabel1.Text = "Transfert Fini";
                        }
     
                    }
     
                }
    le programme fonctionne bien, je voulais juste ajouter une prograssBar pour suivre l'envoi des données, j'ai essayé le timer mais ça se déclenche toujours à la fin de la transmission.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Normalement ça fait le boulot :

    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
    33
    34
    35
    36
    37
    38
     
    string str = "blablablabla";
    		var pb = new ProgressBar();
    		int taillePaquet = 50;
     
    		public void Envoyer()
    		{
    			pb.Minimum = 0;
    			pb.Maximum = str.Length;
    			pb.Value = 0;
     
    			var tache = new Task(() =>
    			{
    				int index = 0;
    				while (index < str.Length)
    				{
    					string s = string.Empty;
    					if (index + taillePaquet < str.Length)
    					{
    						s = str.Substring(index, taillePaquet);
    						index += taillePaquet;
    					}
    					else
    					{
    						s = str.Substring(index, str.Length - index);
    						index = str.Length;
    					}
    					this.m_Port.WriteLine(s);
     
    					this.Invoke(new MethodInvoker(delegate
    					{
    						pb.Value = index;
    						pb.Refresh();
    					}));
    				}
    			});
    			tache.Start();
    		}

Discussions similaires

  1. [Débutant] ProgressBar Transfert des données
    Par tintine dans le forum C#
    Réponses: 38
    Dernier message: 09/07/2015, 10h39
  2. transfert des données d'un fichier text vers un fichier excel sous VB
    Par insane_80 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 24/09/2006, 13h32
  3. Transfert des données en langue arabe vers Mysql
    Par naoufal01 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/09/2006, 13h55
  4. Batch d'extraction avec sélection des données ?
    Par beastman007 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2006, 11h02

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