2017-08-08 60 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);