我正在尝试 Windows 重叠 IO,但我似乎无法让它异步工作。我已经编译并运行了下面的程序,但它从不打印任何东西,它只是默默地完成。我读过小读可以变成同步的,所以我特意选择读512MB。
const DWORD Size = 1<<29; // 512MB
char* Buffer = (char*)malloc(Size);
DWORD BytesRead;
OVERLAPPED Overlapped;
memset(&Overlapped, 0, sizeof(Overlapped));
HANDLE File = CreateFile("BigFile", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
assert(File!=INVALID_HANDLE_VALUE);
DWORD Result = ReadFileEx(File, Buffer, Size, &Overlapped, NULL); // This line takes 150ms according to the debugger
assert(Result);
while(!GetOverlappedResult(File, &Overlapped, &BytesRead, FALSE)) {
printf("Waiting...\n");
}
作为附加信息,我已将代码单步执行到调试器中,并在调用期间Overlapped.InternalHigh
更新值(与 相同的值Size
) 。ReadFileEx
我尝试用malloc
, VirtualAlloc
with ReadFileEx
, ReadFile
add替换FILE_FLAG_NO_BUFFERING
,并检查返回ReadFile
0GetLastError
是否ERROR_IO_PENDING
在读取之后。我尝试使用 RAMMap 来查看文件是否在缓存中,但其中只有 96KB。
我正在运行具有 8GB RAM 的 Windows 10(版本 1703)。