本文主要是介绍PoEdu-Windows班-007 异步I/O,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、获取文件大小信息:
获取文件大小:GetFileSizeEx()
BOOL GetFileSizeEx(
HANDLE hFile, // handle to file
PLARGE_INTEGER lpFileSize // file size
);
获取文件在磁盘中占用的大小:GetCompressedFileSize()
DWORD GetCompressedFileSize(
LPCTSTR lpFileName, // file name
LPDWORD lpFileSizeHigh // high-order DWORD of file size
);
其返回值是DDWORD的低32位,第二个参数是高32位。
二、异步I/O
概念:
异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上。预先知道这些数 据的位置,所以预先发起异步IO读请求。等到真正需要用到这些数据的时候,再等待异步IO完成。使用了异步IO,在发起IO请求到实际使用数据这段时间 内,程序还可以继续做其他事情。 -------来源于百度百科CreateFile设置异步通讯方式:
将其倒数第二个参数(dwFlagsAndAttributes)设置为:FILE_FLAG_OVERLAPPED。OVERLAPPED结构体:
typedef struct _OVERLAPPED{
ULONG_PTR Internal; //操作系统保留,指出一个和系统相关的状态
ULONG_PTR InternalHigh; //指出发送或接收的数据长度
union
{
struct{
DWORD Offset; //文件传送的字节偏移量的低位字DWORD OffsetHigh; //文件传送的字节偏移量的高位字
};PVOID Pointer; //指针,指向文件传送位置
};} OVERLAPPED, *LPOVERLAPPED;
HANDLE hEvent; //指定一个I/O操作完成后触发的事件
如何判断ReadFile/WriteFile是否成功?
三、异步I/O完成提醒方式:
使用设备内核对象
WaitForSingleObject()来等待一个对象的完成。使用事件内核对象
需要使用CreateEvent(nullptr,TRUE,FALSE,TEXT(“EventName”));来创建一个事件对象。(每一个事件对象在操作系统的是唯一的,可以跨程序使用,和互斥体类似)程序示例:
可提醒I/O
APC机制:当线程为可提醒状态下(可以理解为非繁忙状态) 执行APC列表中的事情(自动执行)。Wait系列函数,SleepEx函数等可将线程设置为可提醒状态。
需要使用ReadFileEx和WriteFileEx函数。
程序示例:
I/O完成端口
CreateIoCompletionPort()函数:HANDLE CreateIoCompletionPort
(
HANDLE FileHandle, // handle to file);
HANDLE ExistingCompletionPort, // handle to I/O completion port
ULONG_PTR CompletionKey, // completion key
DWORD NumberOfConcurrentThreads // number of threads to execute concurrently
程序示例:
这篇关于PoEdu-Windows班-007 异步I/O的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!