typedef struct _OVERLAPPED { DWORD Internal; //[out] error code DWORD InternalHigh; //[out] number of bytes transferred DWORD Offset; //[int] low 32it offset DWORD OffsetHigh; //[int] high 32it offset HANDLE hEvent; //[int] evernt handle or data } OVERLAPPED, *LPOVERLAPPED;
技术 | 简介 |
触发设备内核对象 |
一个线程发出I/O请求,另一个线程出结果进行处理。
当向一个设备同时发出多个I/O请示时,则无能为力。因为设备只有一个,其处于激发状态与否,只能表示一个请求的状态。
|
触发事件内核对象 |
一个线程发出I/O请求,另一个线程出结果进行处理。
可以向一个设备同时发出多个I/O请求(为每个请求建立相应的事件对象)
|
使用可提醒I/O | 可以向一个设备同时发出多个I/O请求,发出请求的线程处理结果 |
使用I/O完成端口 |
一个线程发出I/O请求,另一个线程出结果进行处理。
可以向一个设备同时发出多个I/O请求
|
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...); BYTE bBuffer[100]; OVERLAPPED o = {0}; o.Offset = 345; bool bReadDone = ReadFile(hFile, bBuffer, 100, NULL, &o); DWORD dwError = GetLastError(); if (!bReadDone && (dwError == ERROR_IO_PENDING)) {//waiting for it to complete WaitForSingleObject(hFile, INFINITE); //挂起,等待完成请求,此时 驱动程序会将 设备内核设为触发状态 bReadDone = TRUE; } if(bReadDone) { //finished } else { //error occurred; See dwError }
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...); BYTE bReadBuffer[100]; OVERLAPPED oRead = {0}; o.Offset = 0; oRead.hEvent = CreateEvent(...); ReadFile(hFile, bReadBuffer, 100, NULL, &oRead); BYTE bWriteBuffer[100] = {......}; OVERLAPPED oWrite = {0}; o.Offset = 0; oWrite.hEvent = CreateEvent(...); WriteFile(hFile, bReadBuffer, _countof(bWriteBuffer), NULL, &oWrite); .... HANDLE h[2]; h[0] = oRead.hEvent; h[1] = oWrite.hEvent; DWORD dw = WaitForMultipleObjects( 2, h, FALSE, INFINITE); switch(dw - WAIT_OBJECT_0) case 0://Read completed { .... break; } case 1://write completed { .... break; } }