异步I/O(2)使用事件内核对象
来源:互联网 发布:现代德军 淘宝 编辑:程序博客网 时间:2024/05/16 10:13
进行异步I/O的四种方式
1. 使用设备内核对象使用设备内核对象
2. 使用事件内核对象
3. 可提醒I/O可提醒I/O
4. I/O完成端口I/O完成端口
在进行异步I/O操作的时候
HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile);//dwFlagsAndAttributes这个参数必须设为FILE_FLAG_OVERLAPPED
此时需要用到OVERLAPPED的结构体
typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; }; PVOID Pointer; }; HANDLE hEvent;} OVERLAPPED, *LPOVERLAPPED;
使用事件内核对象进行异步I/O操作时需要对该结构体的hEvent进行设置
OVERLAPPED oRead = { 0 };oRead.hEvent = CreateEvent(nullptr, TRUE, FALSE, L"ReadEvent");ReadFile(hFile, bReadBuf, 100, nullptr, &oRead);
HANDLE WINAPI CreateEvent( _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, //一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承 _In_ BOOL bManualReset, //指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态 _In_ BOOL bInitialState, //指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态 _In_opt_ LPCTSTR lpName //指定事件的对象的名称);
简单的事例
int main(){ HANDLE hFile = CreateFileW(L"demo.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, nullptr); if(hFile != INVALID_HANDLE_VALUE) { //Read BYTE bReadBuf[100] = { 0 }; OVERLAPPED oRead = { 0 }; oRead.hEvent = CreateEvent(nullptr, TRUE, FALSE, L"ReadEvent"); ReadFile(hFile, bReadBuf, 100, nullptr, &oRead); //Write BYTE bWriteBuf[10] = { 0 }; OVERLAPPED oWrite = { 0 }; oWrite.hEvent = CreateEvent(nullptr, TRUE, FALSE, L"WriteEvent"); WriteFile(hFile, bWriteBuf, 10, nullptr, &oWrite); //do something 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 0: //read MessageBox(nullptr, L"Read", L"Read", MB_OK); break; case 1: //write MessageBox(nullptr, L"Write", L"Write", MB_OK); break; default: break; } } } return 0;}
阅读全文
0 0
- 异步I/O(2)使用事件内核对象
- 异步I/O 设备内核对象,事件内核对象,可提醒I/O 接收I/O通知
- 异步I/O(1)使用设备内核对象
- 事件对象I/O管理
- nodejs 异步I/O和事件驱动
- NodeJS中的异步I/O、事件驱动
- 15.2 asyncio--异步I/O事件库
- nodejs异步I/O和事件循环
- WINDOWS SOCKET 重叠I/O 事件对象
- WINDOWS SOCKET 重叠I/O 事件对象
- 重叠I/O之事件对象通知
- 重叠I/O之事件对象通知
- 使用 WebClient 执行异步 I/O
- 使用异步 I/O 提高程序性能
- Winsock的事件I/O异步模型——WSAEventSelect
- Node.js 异步式 I/O 与事件驱动
- WDM驱动之异步I/O,事件通知,自旋锁
- Node.js 异步式 I/O 与事件式编程
- 欢迎使用CSDN-markdown编辑器
- c# 笔记
- JSON和JSONP
- visualbox安装ubuntu,第二次开机出现 Welcome to emergency mode! 解决办法
- 2017-05-27 Oracle表分区
- 异步I/O(2)使用事件内核对象
- HTML/CSS 学习笔记(二)
- Maven的settings.xml文件介绍
- 基于spring+hibernate+cxf写的webservice服务,详细配置
- eclipse远程调试Tomcat方法
- 将python或R生成的模型存为PMML供java调用
- Filter的简介
- 推荐系统
- 初学Epicor二次开发地址