Progress bar [Résolu]

Messages postés
7
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
7 juin 2008
- 28 mai 2008 à 19:23 - Dernière réponse :
Messages postés
7
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
7 juin 2008
- 30 mai 2008 à 12:45
Bonjour,

Je me suis mis au C# depuis 3 semaines, alors autant dire que je suis pas très a l'aise,. mais bon c'est en forgeant que l'on de vient forgeron. Non?

J'ai initialisé un progressBar et un timer dans un window form
Ma question:

Peut t'on faire avancer un progress bar dans chaque "tick" du timer ?
Exemple:
            :


            :


            :

           // Initialisation de la barre de progression
            progressBar1.Minimum = 1;
            progressBar1.Maximum = 25000;
            progressBar1.Value = 1;
            progressBar1.Step = 1;
            progressBar1.Visible = true;
                      
            // Lance le timer de 2500 ms pour le progress bar
            timer1.Interval = 250;
            timer1.Enabled = true;
            :


            :


            :

private void timer1_Tick(object sender, EventArgs e)
{
       progressBar1.PerformStep();
       //MessageBox.Show(" passé!!");
 }

Il ne s'incrémente pas, alors que dans une boucle du programme cela fonctionne.
Par contre le message j'ai essayé de mettre un MessageBox et les messges "s'empile" bien.

Merci de votre aide.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
7
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
7 juin 2008
- 30 mai 2008 à 12:45
3
Merci
Bon finalement en cherchant un peu...
Grâce a : sosekeyser et sa source : http://www.csharpfr.com/code.aspx?ID=43556
J'ai trouver une bonne solution simple.
A toutes fins utiles voici l'extrait de code pour ceux que cela interresse ?! 

A bientôt:
Minimulot

<hr size="2" width="100%" />        privatebool readMSP430()
        {
            if (File.Exists("MSP430.txt"))
                File.Delete("MSP430.txt");

            //
Initialisation de la barre de progression

            progressBar1.Minimum = 1;
           
progressBar1.Maximum = 75000;
           
progressBar1.Value = 1;
            progressBar1.Step
= 1;

            // Crée
un nouveau process pour la commande dos de transmission avec l'interface MSP430

            Process
process1 = newProcess();

            // La
fenêtre dos ne doit pas être visible

            process1.StartInfo.CreateNoWindow = true;

            // Paramètre de la commande dos (MSP430_RD.bat)

           
process1.StartInfo.FileName = "cmd";
           
process1.StartInfo.Arguments = "/K
MSP430_RD";

            // Redirige les flux de sortie et d'erreur.

            process1.StartInfo.UseShellExecute
= false;

            //
Redirige la sortie dans StandardOutput

            process1.StartInfo.RedirectStandardOutput
= true;

            //
Redirige les erreurs dans StandardError

           
process1.StartInfo.RedirectStandardError = true;

            // L'événement
ErrorDataReceived indique que le processus a écrit dans son flux StandardError

            process1.ErrorDataReceived += newDataReceivedEventHandler(process1_ErrorDataReceived);

            // Démarre le processus

            process1.Start();

            // Start the asynchronous read of the standard error
stream.

            process1.BeginErrorReadLine();           

            //
Boucle d'attente de 4 secondes a moins d'un message d'erreur

            txtError = "";
            long ticks = DateTime.Now.Ticks;
            long timeout = 0;

            do

            {
               
progressBar1.PerformStep();
                timeout
= DateTime.Now.Ticks - ticks;  // dif. en 100ns
(10000000 = 1 sec)
            } while ((timeout <40000000)&& (txtError
""));

            //
Annule l'opération de lecture asynchrone sur le flux StandardError redirigé

            process1.CancelErrorRead();

            // Si
le fichier : MSP430.txt à été reçu tout va bien sionon erreur

            if (File.Exists("MSP430.txt"))
                return (true);
            else

              return (false);
        }

        // Evénement
en cas d'erreur de transmission avec l'interface MSP430

        privatevoid process1_ErrorDataReceived(object sender, DataReceivedEventArgs
e)
        {
            txtError = e.Data;
        }

Merci minimulot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de minimulot
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 29 mai 2008 à 08:32
0
Merci
la progressbar ne sincrémente pas et passe a 100 d'un coup au bout? si cest bien le probleme, cest parce que ton thread est occupé a autre chose et ne traite pas l'evenement tick. il faut alors dans ton traitement lourd appeler Application.DoEvents régulièrement, ou utiliser un thread pour le traitement lourd en question (le mieux étant d'utiliser un BackgroundWorker)
Commenter la réponse de leprov
Messages postés
7
Date d'inscription
vendredi 11 avril 2008
Dernière intervention
7 juin 2008
- 29 mai 2008 à 14:57
0
Merci
loprov, merci de ta réponse.

Non, mon progressbar n'avance pas du tout, il est vrai que... c'est un peu compliqué...
En fait il vaut mieux que j'explique le problème a résoudre depuis le début: :-)

Je dois récupérer un fichier *.txt lancé par un process sur une commande DOS *.bat. Cette commande *.bat passée j'attend donc un fichier *.txt, le processeur et donc occupé a attendre ce fichier.

Avant d'utilser un timer j'ai réalisé le code ci-dessous qui fonctionne normalement . C'est à dire que le progressBar avance naturellement :

private
bool readMSP430()
{
      
if (
File.Exists(
"MSP430.txt"))
            
File.Delete(
"MSP430.txt");

      // Initialisation de la barre de progression
      progressBar1.Minimum = 1;
      progressBar1.Maximum = 72000;
      progressBar1.Value = 1;
      progressBar1.Step = 1;

      // Process pour lecture du MSP430 par la commandeDOS: MSP430_RD.bat
      Process p =
new
Process();
      p.StartInfo.UseShellExecute =
false;
      p.StartInfo.CreateNoWindow =
true;
      p.EnableRaisingEvents =
true;
      p.StartInfo.RedirectStandardError =
true;
      p.StartInfo.RedirectStandardOutput =
true;
      p.StartInfo.FileName =
"cmd";
      p.StartInfo.Arguments =
"/K MSP430_RD";
      p.Start();








      long
ticks =

DateTime
.Now.Ticks;


      float
timeout = 0;
      do

      {
            progressBar1.PerformStep();
            timeout =
DateTime.Now.Ticks - ticks;
// différence en centaines de ns
      }
while ((!
File.Exists(
"MSP430.txt")) 
            && (timeout <= 40000000));
// 4 seconde de timeout
      
 if (!
File.Exists(
"MSP430.txt"))
      {
            txtError = p.StandardError.ReadLine();

            return (
false);
      }

      else
            return (
true);
}

Mais j'aimerais bien qu'en cas d'erreur de communication (*.bat appelle une interface USB qui va lire de la mémoire dans une platine électronique externe) on sorte tout de suite de la boucle do/while.
J'avais imaginé mettre "txtError = p.StandardError.ReadLine();" dans la boucle et tester en testant également txtError, ça marche, en cas d'erreur on sort bien avant le timeout de 4 seconde, mais malheureusement le progressBar ne fonctionne plus. D'ou l'idée du timer....

Qui aurait une idée d'une autre manière de procéder...
Merci de votre aide.
Minimulot
Commenter la réponse de minimulot

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.