步骤:

  1、CreateIoCompletionPort,创建一个I/O完成端口

  2、创建或者打开一个设备,CreateFile,一定要注意它的参数

  3、CreateIoCompletionPort,再次使用这个函数,将一个设备加入到I/O完成端口。

  4、创建一个线程,并为这个线程需要用到数据时,就在这个前面加个GetQueuedCompletionStatus,这个函数就相当于WaitForSingleObject这个函数,当任务完成时,获得执行权。

对I/O完成端口的个人理解:

  1、其实I/O完成端口就相当于可提醒内核对象。

  2、I/O完成端口多用来处理异步操作

代码:

#include <iostream>
#include <afx.h>
#include <process.h>
using namespace std;HANDLE g_hDevice, g_hFileSrc;
char buff[1000];CRITICAL_SECTION g_cs;UINT WINAPI WhenCome(PVOID pParame)
{DWORD dwTransLen = 0;DWORD dwKey = 0;LPOVERLAPPED  overLap = {0};BOOL IsOk = GetQueuedCompletionStatus(g_hDevice, &dwTransLen, &dwKey, &overLap, INFINITE);
  EnterCriticalSection(&g_cs);DWORD dwErr = GetLastError();cout << "Thread: " << dwErr << endl;LeaveCriticalSection(&g_cs);if(IsOk){cout << "The Content is:" << buff << endl;}else{cout << "failed"  << endl;}return 0;
}void main()
{InitializeCriticalSection(&g_cs);DWORD dwErr;//创建IO完成端口g_hDevice = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);//打开文件g_hFileSrc = CreateFile(L"D:\\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);//将该设备(文件)与IO完成端口相关联,以获得通知HANDLE h = CreateIoCompletionPort(g_hFileSrc, g_hDevice, NULL, 0);if(h == g_hDevice)cout << "关联成功" << endl;elsecout << "关联失败" << endl;OVERLAPPED overLap;overLap.hEvent = 0;overLap.Offset = 0;overLap.OffsetHigh = 0;ReadFile(g_hFileSrc, buff, 1000, 0, &overLap);HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, WhenCome, NULL, 0, NULL);WaitForSingleObject(hThread, 1000);CloseHandle(g_hDevice);CloseHandle(g_hFileSrc);CloseHandle(hThread);DeleteCriticalSection(&g_cs);
}

结果:

我遇到的问题:

1、一定得注意CreateFile的参数,特别是当我们需要以异步的方式来访问数据的时候,我们需要在dwFlagAndAttributes设置FILE_FLAG_OVERLAPPED。

2、如何你想读取一个文件的内容,并将它放在一个buf中,那么你就不能在dwFlagAndAttributes设置FILE_FLAG_NO_BUFFERING。

转载于:https://www.cnblogs.com/wang-can/p/3336765.html

I/O异步之I/O完成端口相关推荐

  1. 一起谈.NET技术,.NET异步编程:IO完成端口与BeginRead

    写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过前几篇文章(为什么需要异步,传统的异步编程,使用CPS及 ...

  2. Windows系统编程之异步I/O和完成端口 [北极星2003 看雪论坛]

    一.  同步I/O和异步I/O 在介绍这部分内容之前先来认识下"异步I/O".   说起异步IO,很容易联想到同步I/O,对于同一个I/O对象句柄在同一时刻只允许一个I/O操作,其 ...

  3. .NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead

    本文首发在IT168 写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过三篇文章后很多人对IO异步背后实现 ...

  4. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...

  5. Windows内核原理-同步IO与异步IO

    目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查异常连接导 ...

  6. 基于FPGA的异步FIFO设计

    今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...

  7. 消息队列NetMQ 原理分析2-IO线程和完成端口

    目录 前言 介绍 目的 IO线程 初始化IO线程 Proactor 启动Procator线程轮询 处理socket IOObject 总结 前言 介绍 [NetMQ](https://github.c ...

  8. Shell脚本学习-阶段二十六-Web服务与端口

    文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...

  9. 安全知识云服务器ip端口网络 socket 编程 端口 大全

    2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发生器 20端口 ...

最新文章

  1. 46、我的C#学习笔记12
  2. 2021年春季学期-信号与系统-第四次作业参考答案-第一小题
  3. 80%的企业社会化商务应用可能无法取得预期效果
  4. 增强学习(一) ----- 基本概念
  5. 【译】Typescript的类型(二)
  6. 【Linux】一步一步学Linux——dirname命令(35)
  7. Spring Boot 2中的功能切换
  8. [THUWC2017] 在美妙的数学王国畅游
  9. linux服务器配置python环境_服务器python环境配置福利,CentOS ,Linux 一键下载python3和环境配置...
  10. 【matplotlib笔记】3D图像绘制
  11. 这些神经网络调参细节,你都了解了吗
  12. ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately
  13. mysql数据库性能监控工具MONyog实战
  14. php集成环境xampp完整安装过程
  15. 金蝶K3Cloud中DBUtils的用法
  16. CAD 二次开发 图层操作(1)创建图层
  17. Element-UI中打开本地文件
  18. 参考文献起止页码怎么写_怎么看论文的起止页码
  19. Java开发工具下载地址
  20. GOIP卡机网关SIM 对接群呼叫客服系统 自动外呼

热门文章

  1. Pyqt5 获取命令行参数sys.argv
  2. NESPER的大体结构 z
  3. C# socket 解析http 协议
  4. Silverlight游戏设计(Game Design):(五)面向对象的思想塑造游戏对象
  5. hadoop8088端口查看历史打不开,但是在虚拟机上可以打开的解决办法
  6. SSM高级整合项目实战
  7. 「luogu3704」[SDOI2017]数字表格
  8. 不自动切换eclipse视图
  9. 三层架构(我了解并详细分析)
  10. 【AngularJS】—— 4 表达式