// 03 完成端口.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> typedef struct _MYOVERLAPPED { OVERLAPPED sysOver; char* buf; }MYOVERLAPPED, *PMYOVERLAPPED; DWORD WINAPI TheadProc(LPVOID Param) { HANDLE hIoPort = HANDLE(Param); DWORD dwSize = 0; DWORD dwKey = 0; PMYOVERLAPPED pOver = NULL; while (true) { DWORD Result = GetQueuedCompletionStatus( hIoPort, //等待通知的完成端口 &dwSize, //传输数据的大小 &dwKey, //完成键 (LPOVERLAPPED*)&pOver, -1 ); pOver->buf; } } int _tmain(int argc, _TCHAR* argv[]) { //1 创建一个异步IO的文件 HANDLE hFile = CreateFile( L"D:\1.exe", //文件路径 GENERIC_READ | GENERIC_WRITE, //操作权限 0, //共享方式 NULL, //安全属性 OPEN_EXISTING, //打开方式 FILE_FLAG_OVERLAPPED, //最重要的!!!!已异步的方式打开一个文件 NULL //没用 ); //2 创建一个完成端口 SYSTEM_INFO si; GetSystemInfo(&si); HANDLE hIoPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, si.dwNumberOfProcessors); //3 将完成端口与异步IO设备绑定 CreateIoCompletionPort(hFile, hIoPort, 0, 0); //4 创建在完成端口上运行的线程 for (int i = 0; i < si.dwNumberOfProcessors * 2;i++) { CreateThread(NULL, 0, TheadProc, (HANDLE)hIoPort, NULL, NULL); } //5 产生一个异步IO操作 PMYOVERLAPPED pOver = new MYOVERLAPPED; memset(pOver, 0, sizeof(MYOVERLAPPED)); DWORD dwSize = GetFileSize(hFile, NULL); //获取文件大小 DWORD dwRubbish = 0; char* pbuf = new char[dwSize]; pOver->buf = pbuf; ReadFile(hFile, pbuf, dwSize, &dwRubbish, (LPOVERLAPPED)pOver); system("pause"); return 0; }