Windows学习(005)--异步IO

来源:互联网 发布:微信拼团软件 编辑:程序博客网 时间:2024/06/05 19:32

1.异步I/O提醒方式。

  • 设备内核对象。
  • 时间内核对象。
  • 可提醒I/O。
  • I/O完成端口。

2.使用事件内核对象完成I/O提醒操作。

  • 事件内核对象纯在操作系统里面,是所有程序共享。
  • 可以用于程序之间交互。
  • 简单实现:
int _tmain(int argc, _TCHAR* argv[]){    HANDLE  hFile=CreateFile(TEXT("demo.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, nullptr);//事件内核对象    if (hFile != INVALID_HANDLE_VALUE)    {        //Read        BYTE bReadBuffer[100] = { 0 };        OVERLAPPED oRead = { 0 };        oRead.Offset = 0;        oRead.hEvent = CreateEvent(nullptr, TRUE, FALSE, TEXT("ReadEvent"));        ReadFile(hFile, bReadBuffer, sizeof(bReadBuffer), nullptr, &oRead);        //Write        BYTE bReadBuffer[5] = { 1,2,3,4,5 };        OVERLAPPED oWrite = { 0 };        oWrite.Offset = 0;        oWrite.hEvent = CreateEvent(nullptr, TRUE, FALSE, TEXT("WriteEvent"));        WriteFile(hFile, bReadBuffer, sizeof(bReadBuffer), nullptr, &oWrite);        //Do some..        //其它线程        HANDLE hOverLapped[2] = {0};        hOverLapped[0] = oRead.hEvent;        hOverLapped[1] = oWrite.hEvent;        while (true)        {            DWORD dwCase = WaitForMultipleObjects(2, hOverLapped, FALSE, INFINITE);            switch (dwCase - WAIT_OBJECT_0)            {            case 1:                //读完成            case 2:                //写完成            default:                break;            }        }    }    else    {    }    return 0;}

3.可提醒IO。

  • 发送请求->完成后,操作提醒来做。
  • APC机制,进程->线程,当线程闲的时候(可提醒状态),线程来做APC列表中的事情。
  • 简单代码:
#include <Windows.h>VOID CALLBACK FileIOCompletionRoutine(    _In_    DWORD        dwErrorCode,    _In_    DWORD        dwNumberOfBytesTransfered,    _Inout_ LPOVERLAPPED lpOverlapped    ){    MessageBox(nullptr, TEXT("Read"), TEXT("Read"), MB_OK);}int _tmain(int argc, _TCHAR* argv[]){    HANDLE  hFile = CreateFile(TEXT("demo.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, nullptr);//事件内核对象    if (INVALID_HANDLE_VALUE != hFile)    {        BYTE bReadBuff[255] = { 0 };        OVERLAPPED oRead = { 0 };        ReadFileEx(hFile, bReadBuff, 255, &oRead, FileIOCompletionRoutine);        SleepEx(1000, TRUE);//第二个参数TRUE将线程变成可提醒状态    }    return 0;}
  • 缺点
    • 回调函数拿不到bReadBuff里的值。
原创粉丝点击