A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 化宝峰 中级黑马   /  2012-8-31 14:55  /  2482 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

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

未命名.jpg

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

6 个回复

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

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

我记得学java的时候,老师讲到线程问题,可以人为设置线程的优先级,但是设置成高优先级的线程未必有低优先级的线程优先执行,当时老师就没给讲明白,不知道怎么回事。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
孙玉昌 发表于 2012-8-31 16:49
我记得学java的时候,老师讲到线程问题,可以人为设置线程的优先级,但是设置成高优先级的线程未必有低优 ...

优先级应该是在同等条件下,优先响应优先级高的线程吧,这个具体就得去问问懂操作系统的牛人了,反正线程是个很神奇的东西。
回复 使用道具 举报
嗯啊,呵呵,慢慢理解吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马