黑马程序员技术交流社区

标题: serialPort控件的事件问题,求高手! [打印本页]

作者: 化宝峰    时间: 2012-8-31 14:55
标题: serialPort控件的事件问题,求高手!
最近公司让写一个串口通讯的功能加到原来的系统中。使用的是serialPort这个控件,命令到达的相关处理是在SerialPort.DataReceived 事件中进行处理的。
看了下MSDN中的说明:
“从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。”
这里有几个疑问,望大牛们指点下。
1、辅助线程上引发事件和主线程上引发事件有啥不同?
2、这个事件在辅助线程上处理,事件会不会重复引发,意思就是这个DataReceived事件已经引发,串口又有数据到达,这个时候,先前那个时间处理过程还没结束,这个事件会立即引发还是延迟引发,或是别的一种机制?这个问题是关键,也就是这个辅助线程是只在一个线程中串行处理。还是可以有几个线程,对引发的DataReceived事件并行处理的?
很是感谢!

未命名.jpg (36.67 KB, 下载次数: 56)

未命名.jpg

作者: 许庭洲    时间: 2012-8-31 15:35
个人认为辅助线程和主线程引发事件机制和原理大致相同,只是处理事件先后顺序和触发时刻不同;
当服务器的数据发过来后,进行数据处理和分析,再根据条件判断触发哪一个线程,等该线程操作数据完毕,即可等待下一个触发。
作者: 化宝峰    时间: 2012-8-31 16:05
许庭洲 发表于 2012-8-31 15:35
个人认为辅助线程和主线程引发事件机制和原理大致相同,只是处理事件先后顺序和触发时刻不同;
当服务器的 ...

你的意思就是:
辅助线程上的事件是串行处理的,当前这个时间处理程序没有处理完的话,即使触发条件满足,事件也不会引发哦!关于这方面的知识,网上的资源好少,找了半天,没有找到相关的。
作者: 许庭洲    时间: 2012-8-31 16:19
是啊,事件触发最好以队列形式触发,先来先处理,等数据处理完毕后,即可等待下一次触发,而且每个被触发的模块都有辅助线程事件处理机制。
作者: 孙玉昌    时间: 2012-8-31 16:49
许庭洲 发表于 2012-8-31 16:19
是啊,事件触发最好以队列形式触发,先来先处理,等数据处理完毕后,即可等待下一次触发,而且每个被触发的 ...

我记得学java的时候,老师讲到线程问题,可以人为设置线程的优先级,但是设置成高优先级的线程未必有低优先级的线程优先执行,当时老师就没给讲明白,不知道怎么回事。
作者: 化宝峰    时间: 2012-8-31 16:52
孙玉昌 发表于 2012-8-31 16:49
我记得学java的时候,老师讲到线程问题,可以人为设置线程的优先级,但是设置成高优先级的线程未必有低优 ...

优先级应该是在同等条件下,优先响应优先级高的线程吧,这个具体就得去问问懂操作系统的牛人了,反正线程是个很神奇的东西。
作者: 孙玉昌    时间: 2012-8-31 16:53
嗯啊,呵呵,慢慢理解吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2