I/O异步之I/O完成端口
步骤:
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完成端口相关推荐
- 一起谈.NET技术,.NET异步编程:IO完成端口与BeginRead
写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过前几篇文章(为什么需要异步,传统的异步编程,使用CPS及 ...
- Windows系统编程之异步I/O和完成端口 [北极星2003 看雪论坛]
一. 同步I/O和异步I/O 在介绍这部分内容之前先来认识下"异步I/O". 说起异步IO,很容易联想到同步I/O,对于同一个I/O对象句柄在同一时刻只允许一个I/O操作,其 ...
- .NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead
本文首发在IT168 写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型.但经过三篇文章后很多人对IO异步背后实现 ...
- DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...
2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...
- Windows内核原理-同步IO与异步IO
目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查异常连接导 ...
- 基于FPGA的异步FIFO设计
今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...
- 消息队列NetMQ 原理分析2-IO线程和完成端口
目录 前言 介绍 目的 IO线程 初始化IO线程 Proactor 启动Procator线程轮询 处理socket IOObject 总结 前言 介绍 [NetMQ](https://github.c ...
- Shell脚本学习-阶段二十六-Web服务与端口
文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...
- 安全知识云服务器ip端口网络 socket 编程 端口 大全
2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发生器 20端口 ...
最新文章
- 46、我的C#学习笔记12
- 2021年春季学期-信号与系统-第四次作业参考答案-第一小题
- 80%的企业社会化商务应用可能无法取得预期效果
- 增强学习(一) ----- 基本概念
- 【译】Typescript的类型(二)
- 【Linux】一步一步学Linux——dirname命令(35)
- Spring Boot 2中的功能切换
- [THUWC2017] 在美妙的数学王国畅游
- linux服务器配置python环境_服务器python环境配置福利,CentOS ,Linux 一键下载python3和环境配置...
- 【matplotlib笔记】3D图像绘制
- 这些神经网络调参细节,你都了解了吗
- ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately
- mysql数据库性能监控工具MONyog实战
- php集成环境xampp完整安装过程
- 金蝶K3Cloud中DBUtils的用法
- CAD 二次开发 图层操作(1)创建图层
- Element-UI中打开本地文件
- 参考文献起止页码怎么写_怎么看论文的起止页码
- Java开发工具下载地址
- GOIP卡机网关SIM 对接群呼叫客服系统 自动外呼