2014-06-09 19 views
0

我想從mod bus協議中獲取數據,並使用標籤以窗口形式自動顯示和更新它。但是我遇到了一個問題,我不得不點擊按鈕來顯示更新的數據,而不是標籤自動顯示。我的代碼在下面,有人可以指出我錯在哪裏以及如何糾正它。非常感謝:)如何使用線程自動更新標籤

private void Call() { 

    do 
    { 
     RequestData(); //get data from mod bus 
     run(a.ToString()); 
    } while (operation); 
} 

delegate void CallMethod(string Data); 

private void run(string data) { 

    if (this.labelO2.InvokeRequired) 
    { 
     SetRichBoxCallBack d = new SetRichBoxCallBack(run); 
     this.Invoke(d, new object[] { data }); 
    } 
    else { 
     labelO2.Text = data; 
    } 
} 
Thread thread; 

private void button1_Click(object sender, EventArgs e) 
{ 

    thread = new Thread(new ThreadStart(Call)); 
    thread.Start(); 
} 

public void RequestData() 
{ 
    if (WriteSerialPort(setMessage, 0, 8)) 
    { 
     Thread.Sleep(1000); 
     for (i = 0; i < 19; i++) 
     { 
      MM[i] = (byte)serialPortBoard.ReadByte(); 
     } 

     a = MM[11] << 8 | MM[12]; 
     b = (int)MM[13] << 8 | MM[14]; 
    } 
} 
+0

它是一個Windows窗體應用程序或者是WPF? – cvraman

+0

這是一個Windows窗體應用程序。 – steven

+2

爲什麼你爲同樣的問題打開另一個帖子? [http://stackoverflow.com/questions/24115077/how-to-update-a-form-from-a-thread#24115077](http://stackoverflow.com/questions/24115077/how-to-update- a-form-from-a-thread#24115077) –

回答

0

與替換以下代碼:

private void run(string data) { 

    //if (this.labelO2.InvokeRequired) 
    //{ 
    // SetRichBoxCallBack d = new SetRichBoxCallBack(run); 
    // this.Invoke(d, new object[] { data }); 
    //} 
    //else { 
    // labelO2.Text = data; 
    //} 

    this.Invoke(new MethodInvoker(delegate {labelO2.Text = data;})); 

} 
+0

非常感謝,但標籤仍然無法更新新的數據。 – steven

+0

你試過調試你的代碼嗎?執行期間是否有任何異常提升? – Ricky

+0

只有點擊按鈕才能更新最新數據。當我調試時,沒有例外。 – steven