您的位置:首页 > 其它

Windows学习(005)--异步IO

2017-05-24 21:49 225 查看
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里的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: