一直没搞明白串口的同步和异步操作有什么区别

citroen_kimi 2010-10-16 07:47:01
同步时ReadFile会死等,但是异步的WaitForSingleObject不也会造成死等,这两种操作如果放在同一线程中有何区别呢?
...全文
5215 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
citroen_kimi 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 delphigis 的回复:]

并不是用了time1<time2,,,,处理数据的时间只有你自己知道啊

如果个别数据处理很费时,你就必须采用异步方式 ,并且要新开个线程,新建buf来处理数据,这样才能一边接收一边处理

如果处理数据的时间相对于接收时间间隔来说可以忽略不计,直接处理就行了
[/Quote]

我经常这样使用,开一线程同步ReadFile,读取到后放在某个缓冲区,另开线程解析(前提是通讯协议加帧头和帧尾),但是遇到应答方式通讯的协议的话,这种处理应该不是很合理,但如果同一线程中用异步WaitForSingleObject似乎跟同步区别不大。用回调肯定是个好办法
citroen_kimi 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 tiger9991 的回复:]

这帖子到最后都快成剧场版了
[/Quote]

既然有星了,说话希望是有建设性的,不是这种无谓的废话
百事烟 2010-10-18
  • 打赏
  • 举报
回复
并不是用了time1<time2,,,,处理数据的时间只有你自己知道啊

如果个别数据处理很费时,你就必须采用异步方式 ,并且要新开个线程,新建buf来处理数据,这样才能一边接收一边处理

如果处理数据的时间相对于接收时间间隔来说可以忽略不计,直接处理就行了


傻X 2010-10-18
  • 打赏
  • 举报
回复
这帖子到最后都快成剧场版了
citroen_kimi 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 delphigis 的回复:]

异步的好处很多,当系统出现异常时,异步方式会更好的控制局面



响应消息1 //来数据了

ReadFile -> 处理数据(存盘,转发........)

响应消息2

消息1和消息2相差time1
处理数据平均需要time2

如果time1>time2,怎么写都可以
如果time1<time2 使用异步方式很有必要
[/Quote]

不排除有这可能,但如果你用了time1<time2,你确定能保证time1<time2吗,我想很少有人用这个的同时心里很有把握。
百事烟 2010-10-18
  • 打赏
  • 举报
回复
异步的好处很多,当系统出现异常时,异步方式会更好的控制局面



响应消息1 //来数据了

ReadFile -> 处理数据(存盘,转发........)

响应消息2

消息1和消息2相差time1
处理数据平均需要time2

如果time1>time2,怎么写都可以
如果time1<time2 使用异步方式很有必要





citroen_kimi 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 delphigis 的回复:]

同步: 窗体A Sendmessage To 窗体B

异步:窗体A Postmessage To 窗体B
窗体B 收到消息后,Sendmessage To 窗体A
窗体A响应消息函数

异步方式下,窗体A Postmessage 之后,和响应B发来消息之间的时间段,可以做任何其它事,并非一直等待


串口的异步操作过程和以上过程类似,,,应该是……
[/Quote]

在串口通讯处理这种功能上,你ReadFile还要去做其他事再去wait取数据,虽然有这种需求,但大部分是需要ReadFile后去解析然后进行下一步动作,没有数据何来解析?
citroen_kimi 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 delphigis 的回复:]

同步: 窗体A Sendmessage To 窗体B

异步:窗体A Postmessage To 窗体B
窗体B 收到消息后,Sendmessage To 窗体A
窗体A响应消息函数

异步方式下,窗体A Postmessage 之后,和响应B发来消息之间的时间段,可以做任何其它事,并非一直等待


串口的异步操作过程和以上过程类似,,,应该是……
[/Quote]

严重不同意你的看法,在数据量大(比如下位机主动不间断的往上位机发送大量字节流)你用异步的效率低于同步
citroen_kimi 2010-10-18
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wltg2001 的回复:]

引用 22 楼 citroen_kimi 的回复:
引用 20 楼 xianglitian 的回复:

如果你只强调在一个线程中使用的效果
那一样
就像用菜刀砍死一个人和用原子弹炸死一个人
从杀死一个人的角度
菜刀和原子弹没有区别


你可以举个在多个线程中ReadFile然后wait的例子,看是否这样比同步好,我认为你Wait后再开个线程,也是多此一举,降低效率

同步……
[/Quote]

不管你任何时候去等待,你还是会造成死等这种局面啊,你延后等待可能还是会没有数据,还是在那等着。我想异步的原来意图肯定不是你说的这种情况,也许设回调是唯一正确的做法
百事烟 2010-10-18
  • 打赏
  • 举报
回复
同步: 窗体A Sendmessage To 窗体B

异步:窗体A Postmessage To 窗体B
窗体B 收到消息后,Sendmessage To 窗体A
窗体A响应消息函数

异步方式下,窗体A Postmessage 之后,和响应B发来消息之间的时间段,可以做任何其它事,并非一直等待


串口的异步操作过程和以上过程类似,,,应该是异步的效率好些,除非你的软件只做收发串口数据这一件事
wltg2001 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 citroen_kimi 的回复:]
引用 20 楼 xianglitian 的回复:

如果你只强调在一个线程中使用的效果
那一样
就像用菜刀砍死一个人和用原子弹炸死一个人
从杀死一个人的角度
菜刀和原子弹没有区别


你可以举个在多个线程中ReadFile然后wait的例子,看是否这样比同步好,我认为你Wait后再开个线程,也是多此一举,降低效率
[/Quote]
同步与异步的区别上面已经说得很清楚了,至于用不用wait那是程序逻辑上的问题,打个比方,在异步方式下,你可以在ReadFile之后不马上去Wait..,而是先去执行别的代码,然后去等待也行啊。
向立天 2010-10-17
  • 打赏
  • 举报
回复
提到效率我还真没有测试过
不过我的意思是说同步和异步操作的真正区别是在硬件的中断方式上
不过关于这一点windows做了封装
citroen_kimi 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xianglitian 的回复:]

如果你只强调在一个线程中使用的效果
那一样
就像用菜刀砍死一个人和用原子弹炸死一个人
从杀死一个人的角度
菜刀和原子弹没有区别
[/Quote]

你可以举个在多个线程中ReadFile然后wait的例子,看是否这样比同步好,我认为你Wait后再开个线程,也是多此一举,降低效率
citroen_kimi 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wltg2001 的回复:]

引用 18 楼 citroen_kimi 的回复:
不是吧,我看到的基本是Wait,VCKBASE上有

刚才看了一下,确实有用ReadFile加WaitFor...函数配合来完成异步读写的。不过这也没有什么问题啊,异步读写调用ReadFile时也是一调用即返回,至于要用WaitF...函数等待那是逻辑上的需求。
我个人感觉用回调函数应该更合理一些。
[/Quote]

我认为应该也是这样才对,可似乎网上资料都是wait,真是奇怪,难道大家用异步都是这样用不觉得有问题
向立天 2010-10-17
  • 打赏
  • 举报
回复
如果你只强调在一个线程中使用的效果
那一样
就像用菜刀砍死一个人和用原子弹炸死一个人
从杀死一个人的角度
菜刀和原子弹没有区别
wltg2001 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 citroen_kimi 的回复:]
不是吧,我看到的基本是Wait,VCKBASE上有
[/Quote]
刚才看了一下,确实有用ReadFile加WaitFor...函数配合来完成异步读写的。不过这也没有什么问题啊,异步读写调用ReadFile时也是一调用即返回,至于要用WaitF...函数等待那是逻辑上的需求。
我个人感觉用回调函数应该更合理一些。
citroen_kimi 2010-10-17
  • 打赏
  • 举报
回复
不是吧,我看到的基本是Wait,VCKBASE上有
wltg2001 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 citroen_kimi 的回复:]
如果像你上面所说的,那确实是同步和异步的差别,但是看到大部分没有用这种,而且用wait,所以我认为用wait跟同步没有什么区别
[/Quote]
我看到的异步例子都是用ReadFileEx来完成的。根本就不用Wait啊,如果要Wait的话,那就不是异步了。所谓的异步就是让主线程不用等待读写工作,如果要等待的话,异步就没有价值了。
citroen_kimi 2010-10-17
  • 打赏
  • 举报
回复
不明白为什么网上大部分例子异步的都是用wait来等待
citroen_kimi 2010-10-17
  • 打赏
  • 举报
回复
如果像你上面所说的,那确实是同步和异步的差别,但是看到大部分没有用这种,而且用wait,所以我认为用wait跟同步没有什么区别
加载更多回复(14)

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧