2017-08-08 63 views
3

我最近碰到這個相當棘手的問題,我希望有人能幫助我。C#trackbar不更新

我有一個程序,使用軌道杆來顯示音量,它通過串行控制與Arduino。

當我嘗試修改trackar的值(programmaticaly)(移動滑塊)以任何方法,它完美的作品用下面的代碼:

trackbar1.Value = ...; 

然而,當我把這個在我的序列數據處理程序,它不工作:/

我宣佈串行數據處理程序是這樣的:

//declaring arduinoCom 
public SerialPort arduinoCOM; 

//In form1 
arduinoCOM.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

我的處理程序是這樣的:

public void DataReceivedHandler(
         object sender, 
         SerialDataReceivedEventArgs e) 
    { 
     trackBar2.Value = 50; 

    } 

串行通信完美無缺,處理程序確實沒有問題。

我已經嘗試了2天,現在我能夠確定工作跟蹤欄和不工作唯一區別是「trackbar1.value」所在的位置。所以我已經刪除了其他的(我希望)unessecary代碼,爲清晰起見。

所以我的問題是,爲什麼當我試圖修改它的「標準法」

附加的信息之外值的TrackBar滑塊不動:我已經試過捉迷藏程序,然後用它暫停視覺stuio和trackbar.Value已成功更改,唯一不起作用的是圖形方面。

我已經與多個trackbars測試,並使用

trackbar1.Refresh(); 

試了一下沒有工作的TrackBar 1和2的值的

圖片以及所有5圖片: Values of trackbars

trackbars not moving

回答

5

爲的SerialPort的DataReceived事件檢索上引發一個secundary線程(而不是UI線程),您無法從中更改UI元素。 使用「調用」,你可以在 取而代之的UI線程的變化

public void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    trackBar2.Value = 50; 

} 

使用:

public void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    if (trackbBar2.IsHandlecreated) trackBar2.Invoke(new Action(() => trackbar.Value = 50)); 
} 
+0

沒有爲我工作,我得到錯誤「調用或begininvoke無法在控件上調用,直到窗口句柄已被創建」。我在網上看過,但我找不到與這個問題非常相符的例子。我會繼續尋找答案。 – Klue

+0

它看起來DataReceived事件在處理程序被添加之後不久被觸發,並且在Window&trackbar本身被正確實例化並且爲它們創建了句柄之前被觸發。您可以在調用他之前檢查此更改(代碼中的答案已更新...) –

+0

此外,當您的應用程序正在關閉窗口而串行端口不斷提升DataReceived事件時,可能會出現該錯誤消息。 因此,在關閉窗口之前(在窗體的onClosing事件中),總是刪除事件處理程序? –

1

我發現這個問題,當我說出我的串行通信我使用`

Form1 form1 = new Mixer.Form1(); 
    initialiseSerialEventHandler(arduinoCOM); 

,而是我應該只使用

 initialiseSerialEventHandler(arduinoCOM);