OVERLAPPED结构--异步IO

    I/O操作可以算得上是计算机执行操作中最慢、最不可测的。所以当我们线程需要向一个设备I/O操作的时候,可以给设备一个“表单”,你先去干这个,干完结果写在这个表单里面寄给我就行了,而自己则去重点内容搞其事情。当这个设备把事情干完了,就会把这个表单填好通知应用程序。这就是异步I/O。而这个“表单”就是OVERLAPPED结构。
   为什么要叫OVERLAPPED结构呢?因为I/O操作的时间和线程执行其它任务的时间是重叠(OVERLAPPED)的。
   typedef struct _OVERLAPPED { 
   DWORD  Internal; 
   DWORD  InternalHigh; 
   DWORD  Offset; 
   DWORD  OffsetHigh; 
   HANDLE hEvent; 
   } OVERLAPPED; 
   这五个成员里面有两个完全就是给文件准备的Offset和OffesetHigh。异步I/O会忽略文件指针,但是当多次对文件进行ReadFile时,想从上一次结束位子开始读的话。那怎么办呢?我们就是用这两个参数来做个标记。
   因为这两个参数是给文件准备的,所以对非文件设备我们必须把它初始化0。
而hEvent成员,主要是IO操作完成时,用来找人的,相当于一个地址ID。一般是IOCP方法使用的。
internal是错误码,internalHigh是传输字节。这个两个是IO操作完成后需要填写的内容。
   异步I/O请求完成时,我们会收到来自执行I/O的设备发来的这个“表单”(OVERLAPPED结构)。但是,这个原始表单数据略显单薄。而如果我们想知道更多东西怎么办呢?比如,我想知道是哪个设备在搞这个。我就要求他把他的设备句柄一起填在上面。
   我们可以自己派生这个OVERLAPPED结构。里面可以添加任何我们想要的附加信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`OVERLAPPED` 结构体是用于实现异步 I/O 操作的关键结构体之一。在使用 `ReadFile` 函数进行异步读取操作时,需要先创建一个 `OVERLAPPED` 结构体,并设置好相关参数。下面是一个示例代码: ```c++ char buffer[1024]; OVERLAPPED overlapped = {0}; // 初始化为0,清空结构体 // 设置偏移量和事件对象 overlapped.Offset = 0; overlapped.OffsetHigh = 0; overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 异步读取数据 if (ReadFile(hFile, buffer, 1024, NULL, &overlapped)) { // 同步操作,数据已经读取完成 // ... } else { // 异步操作,等待操作完成 DWORD error = GetLastError(); if (error != ERROR_IO_PENDING) { // 错误处理 // ... } else { // 等待异步操作完成 if (WaitForSingleObject(overlapped.hEvent, INFINITE) == WAIT_OBJECT_0) { // 异步操作已完成 DWORD bytesRead = 0; GetOverlappedResult(hFile, &overlapped, &bytesRead, TRUE); // 处理读取到的数据 // ... } else { // 等待事件失败 // ... } } } // 关闭事件对象 CloseHandle(overlapped.hEvent); ``` 在上面的示例代码中,我们首先创建了一个 `OVERLAPPED` 结构体,并设置了偏移量和事件对象。然后,我们使用 `ReadFile` 函数进行异步读取操作。如果 `ReadFile` 函数返回 `TRUE`,则表示数据已经读取完成,可以通过 `GetOverlappedResult` 函数获取已经读取的字节数。 如果 `ReadFile` 函数返回 `FALSE`,则表示需要等待异步操作完成。我们可以通过 `GetLastError` 函数获取错误码,如果错误码为 `ERROR_IO_PENDING`,则表示异步操作已经提交,需要等待操作完成。我们可以使用 `WaitForSingleObject` 函数等待事件对象,当事件对象变为有信号状态时,表示异步操作已经完成。此时可以通过 `GetOverlappedResult` 函数获取已经读取的字节数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值