Windows学习(005)--异步IO
2017-05-24 21:49
225 查看
1.异步I/O提醒方式。
设备内核对象。
时间内核对象。
可提醒I/O。
I/O完成端口。
2.使用事件内核对象完成I/O提醒操作。
事件内核对象纯在操作系统里面,是所有程序共享。
可以用于程序之间交互。
简单实现:
3.可提醒IO。
发送请求->完成后,操作提醒来做。
APC机制,进程->线程,当线程闲的时候(可提醒状态),线程来做APC列表中的事情。
简单代码:
缺点
回调函数拿不到bReadBuff里的值。
设备内核对象。
时间内核对象。
可提醒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里的值。
相关文章推荐
- 在 windows IOCP 中,如何等待异步 IO 操作完成(包括被取消)[转]
- windows io 异步读写
- 学习windows驱动(框架和IO请求)
- 网络编程(52)—— Windows下使用WSAEventSelect实现异步通知IO
- libevent学习之五:IO - 同步,异步,阻塞,非阻塞
- 《Windows NT FileSystem Internals》学习笔记之IO_STACK_LOCATION的学习
- Java IO 学习(一)同步/异步/阻塞/非阻塞
- windows 异步 IO
- node.js在windows下的学习笔记(4)---同步,异步,回调的概念
- 【学习笔记】io多路复用中的poll, 以及异步io。
- WINDOWS下异步IO
- IO学习笔记:阻塞 非阻塞 同步 异步
- Windows 8学习笔记(二十一)--C++ 文件异步操作
- 异步设备IO 《windows核心编程》第10章学习
- IO中同步、异步与阻塞、非阻塞的区别 分类: 嵌入式开发学习 2014-04-11 13:47 193人阅读 评论(0) 收藏
- WSAAsyncSelect和windows客户端异步IO模型
- IO的学习笔记 - 同步,异步,阻塞,非阻塞
- windows 核心编程之 10 同步设备IO与异步设备IO
- Python学习:异步IO:协程和asyncio
- swoole深入学习 5. AsyncIO 异步IO