2010-06-28 95 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