完成端口

// 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;
}
原文地址:https://www.cnblogs.com/Alyoyojie/p/5317264.html