文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Windows编程 AIO,APC

Windows编程 AIO,APC

时间:2010-11-17  来源:kgisme170

        Windows的异步io操作,除了可以用重叠IO+事件通知进行等待以外,还可以用注册回调的方法。在CreateFile的时候指定FILE_FLAG_OVERLAPPED,然后ReadFileEx和WriteFileEx函数,最后一个参数就是回调函数的地址。把读和写的操作分开在不同的线程里面实现,用一个Event来同步。读些操作结束以后,用SleepEx来等待异步读些操作的完成通知。
        源代码:

#include "stdafx.h"
#include<windows.h>
#include<stdio.h>
HANDLE hFile;
OVERLAPPED overlap={0};
char content[10]={0};
VOID CALLBACK wf(DWORD dwErrorCode,DWORD dwNumberOfBytes,LPOVERLAPPED lpO){
    Sleep(2000);
    printf("APC写文件结束\n");
}
VOID CALLBACK rf(DWORD dwErrorCode,DWORD dwNumberOfBytes,LPOVERLAPPED lpO){
    printf("APC读取文件的内容:%s\n",content);
}
void* fun(void*){
    printf("线程开始\n");
    Sleep(2000);
    char hw[]="haha.txt";
    if(!WriteFileEx(hFile,(LPVOID)hw,sizeof(hw),&overlap,(LPOVERLAPPED_COMPLETION_ROUTINE)wf)){
        printf("WriteFile failed:%d\n",GetLastError());
    }
    if(!FlushFileBuffers(hFile)){
        printf("Flush failed\n");
    }
    printf("线程结束\n");
    SleepEx(INFINITE, TRUE);//等待本线程注册的APC函数wf结束
    printf("SleepEx等待写操作APC结束\n");
    return NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
    hFile=CreateFile("d:\\abc.txt",
        GENERIC_READ|GENERIC_WRITE,
        FILE_SHARE_WRITE|FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
        NULL);
    if(INVALID_HANDLE_VALUE==hFile){
        printf("CreateFile 失败:%d\n",GetLastError());
        return 1;
    }
    HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)fun,NULL,0,NULL);
    if(NULL==hThread){
        printf("CreateThread 失败:%d\n",GetLastError());
        return 1;
    }
    printf("main等待\n");
    WaitForSingleObject(hThread,INFINITE);//一定要等待Thread通知结束
    printf("main Wait结束\n");
    SetFilePointer(hFile, 0, 0, FILE_BEGIN);
    ReadFileEx(hFile,(LPVOID)content,20,&overlap,(LPOVERLAPPED_COMPLETION_ROUTINE)rf);
    SleepEx(INFINITE, TRUE);//等待本线程注册的APC函数rf结束
    printf("main结束\n");
    CloseHandle(hFile);
    return 0;
}

        运行结果是:
main等待
线程开始
线程结束
APC写文件结束
SleepEx等待写操作APC结束
main Wait结束
APC读取文件的内容:haha.txt
main结束
Press any key to continue . . .

       当然,还有更加简单的方法,就是不需要自己去创建线程和实现线程同步,而是把这个工作交给Windows的线程池,回调函数在注册在线程池当中。这个就要用到BindIoCompletionCallback函数,简化上面的代码,可以完成同样的功能。当然,为了达到对线程池的精确控制,以及什么操作绑定在什么线程上,高性能的IO还是要用到IO Completion Ports的API。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载