在一个程序中,假设存在两个端口(不限于端口,文件等均可以)之间的通信,因端口数据读写远慢于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=TURE,若Internal!=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.hEvent,ov.hEvent即为异步执行的触发器,贯穿整个线程;GetOverlappedResult是一个判断函数,若函数社会就业IO口操作完成,其返回ture,若操作未完成(ov.hEvent标志操作信息),其阻塞该线程,等待后台操作。
在发送信息时同样采用类似操作。