minimulot
Messages postés7Date d'inscriptionvendredi 11 avril 2008StatutMembreDernière intervention 7 juin 2008
-
28 mai 2008 à 19:23
minimulot
Messages postés7Date d'inscriptionvendredi 11 avril 2008StatutMembreDerniè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;
:
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.
minimulot
Messages postés7Date d'inscriptionvendredi 11 avril 2008StatutMembreDerniè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
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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)
minimulot
Messages postés7Date d'inscriptionvendredi 11 avril 2008StatutMembreDerniè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