Progress bar

Résolu
minimulot Messages postés 7 Date d'inscription vendredi 11 avril 2008 Statut Membre Dernière intervention 7 juin 2008 - 28 mai 2008 à 19:23
minimulot Messages postés 7 Date d'inscription vendredi 11 avril 2008 Statut Membre 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.
A voir également:

3 réponses

minimulot Messages postés 7 Date d'inscription vendredi 11 avril 2008 Statut Membre Dernière intervention 7 juin 2008
30 mai 2008 à 12:45
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;
        }
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 mai 2008 à 08:32
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)
0
minimulot Messages postés 7 Date d'inscription vendredi 11 avril 2008 Statut Membre Dernière intervention 7 juin 2008
29 mai 2008 à 14:57
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
0
Rejoignez-nous