日期:2014-05-18  浏览次数:20827 次

这里用多线程可以吗,应如何写?
vs2010 + winform编程环境。
我们用数字仪表的串口输出与电脑的COM1用rs232线缆连接,当有数据到来时串口会触发辅助线程(即serialPort_DataReceived())通过委托指定的函数获取数据,然后将数据实时显示在界面的label1上,代码大致框架如下,运行一切OK。
注意代码中有两条语句前面加了注释符号//。由于客户提出需要使用LED大屏幕同时显示label1的数值,因此我们加入了LED屏幕的代码,就是:LED_Initial(); 和 LEDShow(showValue); 前者用于初始化LED大屏幕,后者实时显示label1的数值。LED屏是慢速设备,初始化就要约2秒钟,实时显示label1的数值也较慢,为了不致主线程在运行时有迟滞假死机的现象,因此我想用多线程来解决。这方面不大熟悉,以上那两条语句用多线程方式应该如何来写?谢谢了。

......
System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort();
private delegate void myDelegate(); //创建委托
......

private void Weighing_Load(object sender, EventArgs e)
{
  serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
  //LED_Initial(); //LED屏初始化
}

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  label1.Invoke(new myDelegate(updateTextBox), new object[] { });
}

private void updateTextBox()
{
  string showValue = "";
  showValue = ......; //用实时称重数据更新界面上label1的值
  label1.text = showValue;
  //LEDShow(showValue); //LED大屏幕实时显示label1的数值
}

------解决方案--------------------
new myDelegate(updateTextBox).BeginInvoke(...)是异步方法
------解决方案--------------------
把DataReceived中的代码都放到线程中,在线程中用委托对lable操作,最好把每次接收到的信息先放到缓存中,比如先放到列表中,线程循环从列表中取数据进行处理,这样防止数据丢失