APC简介:APC

附: 套接字中的WSAOVERLAPPED 和 OVERLAPPED 是一个东西.

OVERLAPPED 中的InternalHigh 用于显示当前读取了多少字节. Internal 用于显示错误信息, 0 即无错误;

GetOverlappedResult 返回的字节以及错误都是根据 OVERLAPPED  结构中的字段来提取的.

这也是为什么GetOverlappedResult 需要的OVERLAPPED结构是一开始初始化的那个

同时也是为什么每个io操作都需要唯一一份OVERLAPPED.

注意: 如果想要复用OVERLAPPED结构(即在一次操作完成之后) . 一定要memset OVERLAPPED ,让其内部清0 .因为内部还

残留上一次操作的记录;

第一个例子. 第二个例子使用APC 来解决一些问题

/*首先使用 OVERLAPPED  结构, 其中有Event 对象, 可用可不用,这个例子先不用CreateFile 其中一个参数使用 FILE_FLAG_OVERLAPPED ReadFile  默认同步, 在最后一个参数使用 OVERLAPPED  ;ReadFile  返回TRUE ,则代表已经读完了否则应该检查 GetLastError , 系统是否为此安排了等待.如果 GetLastError == ERROR_IO_PENDING ,则成功了, 等着取数据, 否则失败之后可以使用 GetOverlappedResult(最后一个参数为TRUE) / WaitForSingObject 来等待直到完成;*/void read_overlapped(const TCHAR * path)
{//这里没有使用其中的 Event 对象. OVERLAPPED overlap = {0};DWORD bytesReaded = 0;BOOL ret = FALSE;char * buf = new char[8196 * 10];// 注意:FILE_FLAG_OVERLAPPED HANDLE hFile = CreateFile(path,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);if(INVALID_HANDLE_VALUE == hFile){cout << "INVALID_HANDLE_VALUE" << endl;return;}//从哪开始读文件 overlap.Offset = 0;//注意overlap 需要传入ret = ReadFile(hFile,buf,8196*10,&bytesReaded,&overlap);//直接就完成了, 您的计算机硬盘可真快if(ret){cout << "done :" <<  bytesReaded << endl;cout << buf << endl;}else{//检测一下错误, 确认是否已经进入准备状态DWORD err = GetLastError();//okif(ERROR_IO_PENDING == err ){//GetOverlappedResult(hFile,&overlap,&bytesReaded,TRUE); 相当于WaitForSingObject//这样其实不太好 , 浪费cpu.while(1){cout << "LOADing: " << GetLastError() << endl;ret = GetOverlappedResult(hFile,&overlap,&bytesReaded,FALSE);if(ret){cout << "ret:" << ret << ",bytesread:" << bytesReaded << endl;break;}}}else{cout << "err : " << err << endl;}}CloseHandle(hFile);
}

通过OVERLAPPED 中的事件对象,对同一个文件读取多次 .

void read_overlapped2(const TCHAR * path)
{HANDLE event_handles[2];OVERLAPPED overlap[2] = {0};char * buf[2] = {0};DWORD  num = 0;HANDLE hFile = CreateFile(path,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);if(INVALID_HANDLE_VALUE == hFile){cout << "INVALID_HANDLE_VALUE" << endl;return;}BOOL ret = 0;int success_len = 0;for(int i = 0; i < 2; ++i){event_handles[i] = CreateEvent(0,TRUE,FALSE,NULL);overlap[i].hEvent = event_handles[i];overlap[i].Offset = i*1000 + i;buf[i] = new char[8196 * 1024];ret = ReadFile(hFile,buf[i],8196 +overlap[i].Offset  ,&num,&overlap[i]);if(ret){cout << "index:" << i << ", is done" << endl;cout << "index:" << i << ",num:" << num;cout << "index:" << i << buf[i] << endl;++success_len;}else {if(GetLastError() != ERROR_IO_PENDING){cout << "index:" << i << "failed" << endl;delete[] buf[i];SetEvent(event_handles[i]);}else {++success_len;}}}cout << "success_len:" << success_len << endl;WaitForMultipleObjects(success_len,event_handles,TRUE,-1);ret = GetOverlappedResult(hFile,&overlap[0],&num,FALSE);cout << "ret:" << ret << ", num:" << num << endl;ret = GetOverlappedResult(hFile,&overlap[1],&num,FALSE);cout << "ret:" << ret << ", num:" << num << endl;CloseHandle(hFile);}

使用ReadFileEx APC:

const int count = 2;
HANDLE event_io;
void CALLBACK ioCompletionRoutine(_In_    DWORD        dwErrorCode,_In_    DWORD        dwNumberOfBytesTransfered,_Inout_ LPOVERLAPPED lpOverlapped)
{int index = (int)lpOverlapped->hEvent;printf("index : %d , readbytes: %d ,err:%d\n", index, dwNumberOfBytesTransfered, dwErrorCode);if (++index == count){SetEvent(event_io);}
}void test_readfileex(const TCHAR * path)
{event_io = CreateEvent(0, TRUE, FALSE, 0);const int bufsize = 2 << 13;HANDLE hFile =CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL);if (INVALID_HANDLE_VALUE == hFile){printf("createfile failed");return;}OVERLAPPED overlap[count] = { 0 };TCHAR* buf[count] = { 0 };DWORD ret = 0 , err = 0;for (int i = 0; i <count; ++i){overlap[i].hEvent = (HANDLE)i;overlap[i].Offset = i *bufsize + i;buf[i] = new TCHAR[bufsize];ret = ReadFileEx(hFile, buf[i], bufsize, &overlap[i], ioCompletionRoutine);err = GetLastError();printf("ret:%d, err:%d\n", ret, err);if (!ret){// 出错了 }}while (1){ //注意是带ex结尾的 . 这里将阻塞ioCompletionRoutine 完成后将返回一次,所以需要判断ret = WaitForSingleObjectEx(event_io, -1, TRUE);if (WAIT_OBJECT_0 == ret)break;elseprintf("WaitForSingleObjectEx return :%d\n", ret);}CloseHandle(hFile);CloseHandle(event_io);for (int i = 0; i < count; ++i)delete[] buf[i];
}

OVERLAPPED I/O 异步APC相关推荐

  1. Windows下OVERLAPPED相关的异步socket函数介绍

    windows提供一组关联OVERLAPPED结构的套接字操作WSASocket.WSASend.WSARecv.WSAIoctl等. 1: WSASocket Description:The WSA ...

  2. Win32多线程 -- 异步IO(overlapped IO)

    一. 异步(overlapped) IO之被激发的File Handle 1.1 Win32 IO操作函数 Win32 之中有三个基本的函数用来执行 I/O      CreateFile()    ...

  3. [6]Windows内核情景分析 --APC

    APC:异步过程调用.这是一种常见的技术.前面进程启动的初始过程就是:主线程在内核构造好运行环境后,从KiThreadStartup开始运行,然后调用PspUserThreadStartup,在该线程 ...

  4. 串口通讯编程一日通2(Overlapped IO模型)

    第一篇初步了解串口的大致运作,接下来我们看基本操作 先看串口操作的数据结构: 串口操作有几个比较重要的Struct 1.Overlapped I/O 异步I/O模型 异步I/O和同步I/O不同,同步I ...

  5. [整理] - Relational Engine之UMS Internals

    SQL Server 6.5使用Windows的调度处理管理多线程,和其它Windows应用程序一样,它使用Windows标准API,没有用到任何隐藏API,这使得 SQL Server的工作线程同其 ...

  6. windows API 串口编程参考

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  7. C# 实现自定义的USB设备与上位机进行通信(上位机部分)

    因为以前没用过USB,对USB也不了解,于是上网查了很多资料,不过网上的资料都是零零散散,不清不楚的,于是我自己总结了一下,下面几个链接是网上这么多零散资料里,我觉得比较有参考意义的. USB设备连接 ...

  8. WIN32 API串口通信编程

    WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作.常用函数及作用下: 函数 ...

  9. 最全的基于c++的serialport.cpp与serialport.h类文件(解析版)

    最全的基于c++的serialport.cpp与serialport.h类文件(解析版) 备注 参考原文件为:serialport.cpp与serialport.h类文件源代码 作者:c344935 ...

最新文章

  1. 京东到家甩包袱给达达 路走错了合并也没
  2. 64位 java 数据类型_全面解析Java支持的数据类型及Java的常量和变量类型
  3. IBM量子计算新突破:成功构建50个量子比特原型机
  4. 的setinterval函数_ES6 极简教程 lt;6gt; 函数扩展
  5. Linux内核模块开发常用内核接口
  6. echarts 地图 dispatchaction不好使_数据分析帝:广东省客户数量地图展示,如何通过python实现?...
  7. linux yum未找到命令,解决yum命令失效,vim: command not found
  8. mysql自定义序号_mysql序列_mysql序列号生成器 mysql自定义函数生成序列号的例子...
  9. QQ坦白说使用Fiddler抓包获取json
  10. 自学无果 报班学习的每日知识点总结与回顾 0基础学前端的小伙伴可以进来看看 一起学习一起进步(三)
  11. Ecowalker充气足球门,为青少年足球训练保驾护航!
  12. 【转】我公务员工作七年后的肺腑之言
  13. 业务范围(business area)
  14. 关于计算机审计应用分析的论文,计算机审计论文
  15. BZOJ_3238_[Ahoi2013]差异_后缀自动机
  16. 图-154飞机简直就是杀人凶器
  17. 简易看盘软件-java
  18. php 转为文本,php html转换成text文本函数
  19. ArcGIS:如何进行缓冲区分析(以市区选择住房位置为例)?
  20. 朴素贝叶斯 分类算法——代码简洁

热门文章

  1. 2019-2020年催化类专业期刊的影响因子
  2. 服务器维护 藏宝阁交易,梦幻西游藏宝阁角色交易条件,藏宝阁买角色多久可以交易角色...
  3. Netty手动实现Dubbo(含视频教程)
  4. 3、Windows之CMD装逼命令————CMD命令打开网页(让人一看你就是个电脑高手)
  5. 机器学习笔记(5)——模型评价指标
  6. SCU - 4572 醉后不知天在水,满船清梦压星河【思维】
  7. python 抛出异常记录
  8. Go --- 使用各服务商的短信服务,实现短信验证等需求
  9. oracle 查询数据库时区,[原创]数据库时区与操作系统不一致时的解决方法
  10. TensorFlow TFRecords简介