[已解决问题] 问:线程间同步问题
提问时间: 2007-12-27 11:18
悬赏分:10 浏览:481 次
应用场景描述:PC 和 一个终端设备通过串口连接,PC 发出指令,终端收到指令后会在几个毫秒内给出相应响应,然后 PC 发出一些后续指令。

软件任务:通过软件界面控制发出数据,等待终端响应,并将收到的数据实时的显示在窗口界面上。

软件实现:利用.net类库的SerialPort组件实现串口通信,串口发出数据是在主线程内完成的,串口收到数据触发 ReceivedData 事件,但是该事件并不在主线程触发,所以不能将数据直接刷在窗口界面上,那么我利用了 Invoke ,将数据显示触发在主线程。

问题提出:主线程在通过串口发出数据后,为了等待响应,我使用了Sleep(100),让主线程休眠100ms,但是如果50ms内就收到数据,ReceivedData 事件所在的线程就会调用 Invoke,让主线程显示数据,但是此时主线程在休眠,我的问题就是,那么 ReceivedData 事件所在的线程是否也会因此被阻塞 50ms 呢?


提问者:杨连国 - 菜鸟二级
最佳答案
会被阻塞。如果你不希望阻塞,可以使用BeginInvoke方法。

另外, 你使用SerialPort组件进行串口通讯。应该就不需要在让主线程Sleep了吧。我觉的流程应该是如下:
1. 挂接ReceivedData事件
2. 通过SerialPort组件发送数据
3. 更新Form的状态。退出ButtonClick处理函数
4. 然后再ReceivedData事件中再次更新Form状态。
2007/12/27 13:13:12 回答者:Colin Han


提问者对于答案的评价:非常感谢 Colin Han 和 亚历山大同志。 是我对 Invoke 和 beginInvoke 了解不够,为了表示感谢,我会将自己了解的情况专门组织一个帖子,还请两位多多指点。
其它回答(1)
会被阻塞。

6个月前   回答者:亚历山大同志 - 初学一级
评论
6个月前   micYng :
会被阻塞,更好的处理流程是:
1.绑定OnDataReceived事件//如果我没记错的话,应该是这个,虽然快有3~4个月没写串口编程了
2.用一个ManualResetEvent事件对象控制时序,同时为了处理方便,用个Timer监视时间,如果超出限定时间,触发事件,同时关闭串口
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除