异步重叠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 函数。
当返回值是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