zoukankan      html  css  js  c++  java
  • 完成端口

    // 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;
    }
  • 相关阅读:
    Oracle数据库安装
    [转]卡西欧手表调日期正确方法
    python密码处理(可用于生产模式)
    [转]python对json的相关操作
    [转]Python中的with…as…
    Python标准库--os模块
    我的github代码添加
    Python正则表达式+自创口诀
    自己总结python用xlrdxlwt读写excel
    CentOS安装+配置+远程
  • 原文地址:https://www.cnblogs.com/Alyoyojie/p/5317264.html
Copyright © 2011-2022 走看看