惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
D
Docker
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
月光博客
月光博客
S
SegmentFault 最新的问题
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI

博客园 - 晨光静默

centos 命令 curl用到的一些命令 nginx记录 html select qq作文 mfc开启控制台打印日记 mfc右键菜单(包括系统托盘菜单)弹窗后如何消失 angular单页应用点击button自动刷新页面 setTimeout中调用angular的作用域生效 mfc模态对话框和非模态对话框注意点 c/c++元转分的bug c/c++中的崩溃代码片段 查看网络端口连接情况 win7x64安装python运行报错:api-ms-win-crt-runtime-|1-1-0.dll SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes qt导入头文件报错 python记录 (转)Curl命令详解 开箱即用的clogger linux xshell 命令上传下载文件 png转CBitmap
异步重叠IO
晨光静默 · 2023-02-23 · via 博客园 - 晨光静默

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