多线程异步通信,OVERLAPPED,CreateEvent,GetOverlappedResult

更新时间:2023-07-17 13:32:44 阅读: 评论:0

在一个程序中,假设存在两个端口(不限于端口,文件等均可以)之间的通信,因端口数据读写远慢于CPU运行,因此常采用异步通信方式。示例如下:
端口A发送信息,端口B接收,此时针对收发信息都采用异步通信:
(1)B接收信息时新建一个线程,并在新建线程中定义一个结构体OVERLAPPED    ov; OVERLAPPED是一个包含了用于异步输入输出的信息的结构体。同时利用ov.hEvent = CreateEvent( NULL,FALSE, FALSE, NULL );新建一个对象事件,该事件用来表明相应任务的执行状况,以此来进行异步通信控制。
矜持是什么意思2)在新建线程中执行端口信息读操作,例如FLAG=ReadFile(hDevice, pbyData, ulWriteCount, pulNumberofWritten, ov);校园生活其中ov就是异步结构体,其中ov.internal为系统内部值,执行完ReadFile之后,若internal=0,则FLAG=TUREInternal!=0表示出现错误或PENDING,于是ReadFile返回FALSE诉求书。然后执行 GetLastError金枪鱼三明治判断异常类型。GetLastError值就是Internal值。
3)若GetLastError 获得的结果为ERROR_IO_PENDING,说明读信息操作正在后台执行。
这也是最常遇到的情况。因为在异步操作中,程序执行完ReadFile后不等其返回结果就转去执行下一步程序或别的线程,IO操作速度跟不上,即返回ERROR_IO_PENDING形容山的句子
4)此时,程序已在别的线程执行,此处通过设置GetOverlappedResult( hDevice, ov, pulNumberofRead, TRUE )早产儿喂养等待ReadFile的执行结果。当ReadFile执行成功,会设置ov.hEvent的内容(前面CreateEvent的作用就体现于此),以此触发GetOverlappedResult,表明执行成功。否则GetOverlappedResult会阻塞该线程一直等待信息接收。
关键点:异步通信时针对单独的IO口建立对应线程专门处理;线程中声明OVERLAPPED    ov控制异步操作,CreateEvent 窗外作文300字声明ov.hEventov.hEvent即为异步执行的触发器,贯穿整个线程;GetOverlappedResult是一个判断函数,若函数社会就业IO口操作完成,其返回ture,若操作未完成(ov.hEvent标志操作信息),其阻塞该线程,等待后台操作。
在发送信息时同样采用类似操作。

本文发布于:2023-07-17 13:32:44,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1085111.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   执行   信息
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图