2010-06-28 66 views
2

我的应用程序是一个C#Windows窗体应用程序。当用户按下按钮“生成”我的应用程序创建一个新线程并运行新的工艺过程进行类似下面标签和进度条

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

我已经委托我的processbar和标签的MSG这个伪代码,这些消息显示出来当它在循环内没有任何问题时,我甚至添加了一个事件来运行Application.DoEvents(),只要标签文本发生变化,但是我的最后一个信息从不显示,我试过在最后一个位置放置Application.DoEvents()味精标签,但没有解决方案。任何人都遇到过这个?

感谢大家的帮助!

编辑

这是我如何编码的我最后MSG(循环之后的一个)

 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(); 
     }); 

FIXED: 我假设我试图显示文本太长...当我用“运行时间:”替换“生成完成:总运行时间”时,它显示o_o

回答

1

你提到这一切都发生在一个新的线程上。不过,你也提到DoEvents。对我来说,这表明你正在从工作线程更新UI,这会是一个问题(另一种可能是你在工作线程上运行,但阻塞了UI线程,这也是一个问题)。

你应该问的UI到UI线程更新本身 - 那你就不要需要DoEvents

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

嘿谢谢你的建议,我已经拿出Application.DoEvents()更改文本,一切仍然运行良好的新线程,但最后的信息仍然不会显示,所有其他信息shwos up perfect – ChickSentMeHighE 2010-06-28 12:25:13

+0

@MikeAbyss - 你确定标签是可见的吗?目前还不清楚在那里出现了什么* – 2010-06-28 12:49:59

+0

是的,标签总是可见的,我的代码也不会改变其可见性,或多或少最后的味精应该显示为“Generation Complete!Total run time [The time它完成了这个过程]“。最初我有一个只包含一个标签的状态栏,这个标签在更新文本和显示时没有问题,但是当我将进度条添加到状态栏时,这个问题就开始发生了。谢谢! – ChickSentMeHighE 2010-06-28 13:04:46

2

您可能想要使用一个使用ReportProgress()的BackgroundWorker来告诉它做了多少进展。

看看这个backgroundWorker Tutorial

更新UI应该由ReportProgress()调用的方法发生。

+0

感谢您的链接,我会尝试后台工作,如果我不能得到我目前的工作 – ChickSentMeHighE 2010-06-28 12:27:08