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

问一个串口通讯问题
我在一个串口通讯程序中用到了serialport串口控件和委托的代码,大致结构如下:

.....
delegate void myDelegate(); //声明委托
.....
.....


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

private void updateTextBox()
{
  //这里含有更改界面控件值如Label1.text的代码
}

由于SerialPort类的serialPort_DataReceived事件是在辅助线程上引发的,而通过网上了解到,Control.Invoke()是要返回主线程(UI线程)后再开始执行委托所指定的方法(updateTextBox())代码的,这么一来好像辅助线程并没有起到什么作用啊。我原先的理解是: 主线程在运行中遇到serialPort_DataReceived事件就开启辅助线程并把委托指向的updateTextBox()方法交给它去处理,而主线程则不管不问了,继续主线程自己的事情。如果Control.Invoke()还是要占用主线程来执行方法代码,岂不是开不开辅助线程都无意义了吗?若updateTextBox()方法的代码很耗时的话主线程不是一样会造成堵塞吗?就这里不是很懂,请明白人给讲一讲,谢谢!


------解决方案--------------------
主线程处理的是windows消息,界面的响应,用户对ui的操作,而监听线程的目的是在有数据的时候第一时间能触发事件,Control.Invoke是辅助线程和主线程的同步,更新界面这一个时刻需要同步,其他大多时间都是两个线程各干各的。怎么能说没有必要呢。
------解决方案--------------------
没用过mySerialPort,如果堵塞不严重的话,可以放在主线程中试一试。

辅助线程是用于执行长时间的堵塞操作的。像处理大文件等。如果在主线程中执行,界面就没有响应了。