// 004_完成端口.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <windows.h>#include <stdio.h>struct MyOverlapped : public OVERLAPPED { MyOverlapped() { // 将OVERLAPPED部分填充为0 memset(this, 0, sizeof(OVERLAPPED)); pBuff = NULL; } char *pBuff; ~MyOverlapped() { if (pBuff) { delete pBuff; } }};DWORD WINAPI threadProc(LPVOID pArg){ HANDLE hIoComp = (HANDLE)pArg; DWORD dwBytes = 0; ULONG_PTR completionKey = 0; MyOverlapped* pOv=NULL; BOOL ret = 0; while ( 1 ) { ret = GetQueuedCompletionStatus( hIoComp, &dwBytes,/*实际完成的字节数*/ &completionKey,/*和文件设备关联在一起的完成键*/ (OVERLAPPED**)&pOv,/*通过ReadFile投递IO任务时传递重叠结构*/ -1/*超时时间*/); if (ret == FALSE) { continue; } printf("读取偏移:[%d]的IO任务完成, 实际读取到的字节数:%d" "读取到的内容是:%s", pOv->Offset, pOv->InternalHigh, pOv->pBuff); delete pOv; } return 0;}int main(){ // 1. 创建异步IO方式的文件对象 HANDLE hFile = INVALID_HANDLE_VALUE; hFile = CreateFile( L"004_完成端口.cpp", GENERIC_READ,/*读写方式:只读*/ FILE_SHARE_READ,/*共享方式: 共享读*/ NULL,/*安全描述符*/ OPEN_EXISTING,/*创建标志:存在时才打开*/ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,/*文件属性和标志:正常属性|重叠IO标志 */ NULL); // 2. 创建一个完成端口对象 SYSTEM_INFO si = { 0 }; GetSystemInfo(&si); HANDLE hIoComp = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, NULL, si.dwNumberOfProcessors/*处理器个数*/); // 3. 将完成端口和文件对象进行绑定 CreateIoCompletionPort( hFile,/*要和完成端口进行绑定的文件句柄*/ hIoComp,/*绑定到哪个完成端口上*/ 0,/*完成键, 和文件句柄关联的值*/ 0); // 4. 创建指定个数线程, 在线程监视完成端口 完成列表的状态 for (int i = 0; i < si.dwNumberOfProcessors; ++i) { CreateThread(0, 0,&threadProc, hIoComp, 0, 0); } DWORD read = 0; // 5. 发起异步IO任务. for (int i = 0; i < 100; ++i) { MyOverlapped* pOv = new MyOverlapped; pOv->pBuff = new char[50]; memset(pOv->pBuff, 0, 50); pOv->Offset = i * 40; ReadFile(hFile, pOv->pBuff, 40, &read, pOv); } while ( 1 ) { Sleep(1000); }}