我想Windows重疊IO,但我似乎無法讓它異步工作。我編譯並運行了下面的程序,但它從不打印任何內容,只是默默地完成。我讀過小讀取可能會同步,這就是爲什麼我故意選擇讀取512MB。窗口重疊IO實際上塊
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");
}
至於更多的信息,我的ReadFileEx
通話過程中加強代碼到調試器,以及Overlapped.InternalHigh
值被更新(具有相同的價值Size
)。
我試着VirtualAlloc
更換malloc
,ReadFileEx
與ReadFile
,加入FILE_FLAG_NO_BUFFERING
,並檢查的ReadFile
的回報率爲0和GetLastError
將ERROR_IO_PENDING
讀之後。我試過使用RAMMap來查看文件是否在緩存中,但只有96KB。
我與8GB的內存運行Windows 10(版本1703)。
也許該文件是由OS緩存,所以OS決定,它可以很容易地服務立即閱讀? – EOF
@EOF會嚴重緩存整個512MB +文件嗎?另外,如果它被緩存了,我的讀取仍然需要150ms ......那麼如果它不能保證我快速返回,那麼重疊點有什麼意義呢? – Lutopia
這實際上與緩存相關。開放文件'FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING'並分配'PVOID緩衝=的VirtualAlloc(0,大小,MEM_COMMIT,PAGE_READWRITE)'(必須對非緩存對齊讀取) - 檢查結果。和你的情況更好地使用'ReadFile'(不'Ex') - 返回給你假在這種情況下,與去年的錯誤 - 'ERROR_IO_PENDING' – RbMm