2010-06-28 20 views
2

Mon application est une application de formulaire Windows C#. Lorsque l'utilisateur appuie sur le bouton « Générer » mon application crée un nouveau thread et exécuter le nouveau processus, le processus va quelque chose comme ce code pseudo ci-dessousBarre de libellé et de progression

Loop counter = 1 to N 
    progressbar = counter/N 
    Display msg on label1 
    Do some tasks 
Loop 
progressbar = 100% 
Display msg on lable1 

J'ai déléguer mes msgs processbar et l'étiquette, les messages apparaît quand il est dans la boucle sans problème, j'ai même ajouté un événement pour exécuter Application.DoEvents() chaque fois que le texte de l'étiquette change, mais mon dernier message n'apparaît JAMAIS, j'ai essayé de placer Application.DoEvents() juste après le dernier msg label, cependant pas de solution. Quelqu'un d'autre rencontre cela avant?

Merci pour l'aide à tous!

Modifier

Voilà comment je codé mon dernier msg (L'un après la boucle)

 this.BeginInvoke((MethodInvoker)delegate() 
     { 
      toolStripProgressBar1.Value = 100; 
      btnCancel.Enabled = false; 
      btnBrowse.Enabled = true; 
      btnSaveTo.Enabled = true; 
      btnGenerate.Enabled = false; 
      // Performance testing 
      lblGeneratingInfo.Text = "Generation Complete! Total Run time: " + DateTime.Now.Subtract(startDate).ToString(); 
     }); 

FIXE: Je présume que le texte que j'ai essayé d'afficher était trop long ... Lorsque j'ai remplacé "Génération terminée: durée d'exécution totale" par "Durée d'exécution:", elle est affichée o 0o

Répondre

1

Vous mentionnez que tout cela se passe sur un nouveau sujet. Cependant, vous mentionnez également DoEvents. Pour moi, cela suggère que vous mettez à jour l'interface utilisateur du thread de travail, ce qui serait un problème (l'autre possibilité est que vous exécutez sur un thread de travail, mais en bloquant le thread de l'interface utilisateur, qui est également un problème).

Vous devriez demander l'interface utilisateur de se mettre à jour sur le thread d'interface utilisateur - alors vous n'avez pas besoinDoEvents:

/* on worker thread */ 
string text = ... 
int progress = ... 
this.Invoke((MethodInvoker)delegate { /* on UI thread */ 
    label1.Text = text; 
    progressBar.Value = progress; 
}); 
/* on worker thread */ 
+0

Hey merci pour le conseil, j'ai sorti le Application.DoEvents() pour le texte changé, tout fonctionne toujours bien sur le nouveau fil, mais le dernier msgs ne s'affiche toujours pas, tous les autres msgs shwos up perfect – ChickSentMeHighE

+0

@MikeAbyss - es-tu sûr que l'étiquette est visible? On ne sait pas ce que * apparaît * là ... –

+0

Oui l'étiquette est toujours visible, mon code ne change pas non plus sa visibilité, plus ou moins le dernier msg devrait apparaître comme "Génération terminée! il a fallu pour finir le processus] ". À l'origine j'avais une bande d'état qui contenait juste une étiquette, cette étiquette n'avait aucun problème en mettant à jour son texte et en étant affichée, cependant quand j'ai ajouté dans la barre de progression dans la bande d'état, ce problème a commencé. Merci! – ChickSentMeHighE

2

Vous pouvez utiliser un BackgroundWorker qui utilise ReportProgress() pour indiquer les progrès réalisés.

Jetez un oeil à ce backgroundWorker Tutorial

Mise à jour de l'interface utilisateur doit seulement se produire dans la méthode appelée par ReportProgress().

+0

Merci pour le lien, je vais essayer travailleur de fond si je ne peux pas obtenir mon actuel pour travailler – ChickSentMeHighE