异步重叠IO

typedef struct _OVERLAPPED
{
  DWORD Internal;
  DWORD InternalHigh;
  DWORD Offset;
  DWORD OffsetHigh;
  HANDLE hEvent;
} OVERLAPPED;

这个结构体是重叠IO模型的核心,称之为重叠结构

Internal              如果IO发生了错误 那么在这个成员中保存错误码
InternalHigh      完成时这个成员是已经操作的字节数
Offset                文件数据的偏移低32位(4字节)
OffsetHigh        文件数据的偏移高32位(4字节)
hEvent               事件对象句柄

 

BOOL WriteFile( [in] HANDLE hFile, [in] LPCVOID lpBuffer, [in] DWORD nNumberOfBytesToWrite, [out, optional] LPDWORD lpNumberOfBytesWritten, [in, out, optional] LPOVERLAPPED lpOverlapped );

如果函数成功,则返回值为非零 (TRUE) 。

如果函数失败或异步完成,则返回值为零, (FALSE) 。 若要获取扩展的错误信息,请调用 GetLastError 函数。

注意GetLastError 代码ERROR_IO_PENDING不是失败;它指定写入操作正在异步完成。 有关详细信息,请参阅“备注”。
 
需要关注WriteFile的返回值,如果是TRUE代表系统很快就可以完成写入文件操作不需要再用重叠IO的方式通知。
当返回值是FALSE的时候就需要GetLastError()获取错误码 ,
但在这里当错误码是ERROR_IO_PENDING不代表错误,而是代表系统已经接收了重叠IO的方式异步写入文件。
 
完成通知:

在重叠IO操作被成功提交后,直到操作完成前,系统会将"文件"句柄置为无信号状态,这意味着可以用wait系列函数去等待。

如:DWORD WINAPI WaitForSingleObject(__in HANDLE hHandle, __in DWORD dwMilliseconds);

//WriteFile返回值判别完成后
//重叠IO ---> 阻塞
WaitForSingleObject(hFile,INFINITE);//一直等到完成
//重叠IO ---> 非阻塞
DWORD ret = WaitForSingleObject(hFile,TIME_OUT);
if(ret == WAIT_OBJECT_0)
{
//完成 处理
}
else if(ret == WAIT_TIMEOUT)
{
//超时时间到
//其他一些操作
}else{}

 

 

参考:https://blog.csdn.net/chijiaozhao5384/article/details/101003514

 

 

posted @ 2023-02-23 11:11  晨光静默  阅读(14)  评论(0编辑  收藏  举报