010 异步I/O处理 002

异步I/0
  ○ 使用设备内核对象
  ○ 使用事件内核对象 提醒同步以及交互
  ○ 可提醒I/O 不可跨线程的
  ○ I/O完成端口

  ⊙ 使用事件内核对象 提醒同步以及交互

  

 1 #include <Windows.h>
 2 int main()
 3 {
 4     //异步操作最大的好处就是不会阻塞
 5     HANDLE hFile = CreateFile(TEXT("Demo.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, nullptr);
 6     if (hFile != INVALID_HANDLE_VALUE)
 7     {
 8         //Read
 9         BYTE bReadBuffer[100] = { 0 };
10         OVERLAPPED oRead = { 0 };
11         oRead.hEvent = CreateEvent(nullptr, TRUE, FALSE, TEXT("ReadEvent")); //事件内核对象
12         ReadFile(hFile, bReadBuffer, sizeof(bReadBuffer), nullptr, &oRead);
13
14         //Write
15         BYTE bWriteBuffer[10] = { 1,2,3,4,5,6,7,8,9,0 };
16         OVERLAPPED oWrite = { 0 };
17         oWrite.hEvent = CreateEvent(nullptr, TRUE, FALSE, TEXT("WriteEvent")); //事件内核对象
18         ReadFile(hFile, bWriteBuffer, sizeof(bWriteBuffer), nullptr, &oWrite);
19
20         //Do Same ....
21         //其他的线程
22         HANDLE hOverLapped[2] = { 0 };
23         hOverLapped[0] = oRead.hEvent;
24         hOverLapped[1] = oWrite.hEvent;
25
26         while (true)
27         {
28             DWORD dwCase = WaitForMultipleObjects(2, hOverLapped, FALSE, INFINITE);
29             switch (dwCase - WAIT_OBJECT_0)
30             {
31             case 0:
32                 //读完成
33                 break;
34             case 1:
35                 //写完成
36                 break;
37             }
38         }
39     }
40     else
41     {
42         //GetLastError();
43     }
44
45     return 0;
46 }

  ⊙ 可提醒的I/O 不可跨线程

 1 #include <Windows.h>
 2
 3 VOID CALLBACK FileIOCompletionReadRoutine(
 4     _In_        DWORD dwErrorCode,
 5     _In_        DWORD dwNumberOfBytesTransfered,
 6     _Inout_        LPOVERLAPPED lpOverladded
 7     )
 8 {
 9     MessageBox(nullptr, TEXT("Read"), TEXT("Read"), MB_OK);
10 }
11
12 int main()
13 {
14     //发送请求
15     //做自己的事情
16     //判断请求是否完成
17
18     //发送请求 -》完成后,操作系统提醒我
19     //可提醒I/0操作
20     //APC
21     //工厂(进程)-》工人(线程)
22     //                    APC机制 当线程空闲的时候(前提) -》 APC列表中的事情(自动执行)
23     //                            线程为可提醒的窗台下
24     //        就是线程空闲的时候
25     //MessageBox        -》   阻塞(闲下来) 不是可提醒状态
26     //Wait Sleep 函数 可提醒的状态
27
28
29     HANDLE hFile = CreateFile(TEXT("Demo.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, nullptr);
30
31     if (hFile != INVALID_HANDLE_VALUE)
32     {
33         const UINT uLen = 255;
34         BYTE bReadBuf[uLen] = { 0 };
35         OVERLAPPED oRead = { 0 };
36         oRead.Offset = 5;
37         ReadFileEx(hFile, bReadBuf, uLen, &oRead, FileIOCompletionReadRoutine);
38
39         SleepEx(100, TRUE);
40         //DWORD WINAPI SleepEx(
41         //    _In_ DWORD dwMilliseconds,
42         //    _In_ BOOL  bAlertable
43         //    );
44
45         //干自己的事情 Do Some......
46         //运行程序 没有弹出消息框
47         //SleepEx    Wait 可以使线程成为空闲状态
48         //while (10)
49         //{
50         //    Sleep(100);
51         //}
52     }
53
54
55     return 0;
56 }
时间: 2024-08-02 10:00:35

010 异步I/O处理 002的相关文章

010 异步I/O处理 003

● 异步I/0 ○ 使用设备内核对象 ○ 使用事件内核对象 提醒同步以及交互 ○ 可提醒I/O 不可跨线程的 ○ I/O完成端口 ⊙ I/O完成端口 ○ 串行模型来进行异步IO操作 ○ 并行模型 -> 多线程 ○ 1个工人 -> 加工零件 -> 5天 -> 串行 ○ 5个工人 -> 加工零件 -> 1天 -> 并行 ○ 单核 -> 模拟出来的多进程 线程 ○ 多核 -> 多线程 核心数 -> CPU的一个核心 ○ 一个进程内可以有多个线程 多线程

010 异步处理Rest服务

一:任务 1.任务 使用Runnable异步处理Rest服务 使用DefaultResult异步处理Rest服务 异步处理的配置 二: 原文地址:https://www.cnblogs.com/juncaoit/p/9733768.html

学习理解 makefile

学习理解 makefile 模拟个应用的例子: 有个工程包括头文件 001.h.002.h.003.h.004.h.005.h.006.h.007.h 共7个:程序文件 001.c.002.c.003.c.004.c.005.c.006.c.007.c.008.c.009.c.010.c 共10个文件.看着头大吧,先不关心具体内容. 现在来编译该工程.如下: # cd example/ # gcc 001.c 002.c 003.c 004.c 005.c 006.c 007.c 008.c 0

5-10年的DBA如何独当一面

在线运行SQL工具 推荐可在线执行SQL的工具: http://sqlfiddle.com/ 这款工具,有两大特点: 支持六大数据库,MySQL,Oracle,SQL Server,PostgreSQL,SQLite; 支持在线编辑及执行SQL,无需自搭数据库环境 简单了解下: image 整个页面分为1,2,3个区域. 区域 1 的编辑器用来创建数据库 schema ,比如建表,新建数据: 区域 2 则用来编辑和执行 SQL: 区域 3 用来展示 区域 2 中的 SQL 执行结果 使用这款工具

IOS之同步请求、异步请求、GET请求、POST请求(转)

1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3.GET请求,将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节: 4.POST请求,将参数放到body里面.POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获. 001 1.  

PE 001~010

题意: 001(Multiples of 3 and 5):对小于1000的被3或5整除的数字求和. 002(Even Fibonacci numbers):斐波那契数列中小于等于4 000 000的偶数求和. 003(Largest prime factor):求600 851 475 143的最大质因数. 004(Largest palindrome product):求由两个三位数相乘得到的最大回文数. 005(Smallest multiple):求能被1~20中所有数整除的最小正整数.

Jquery Ajax 异步设置Table中某列的值

可根据table中某列中的ID去改变某列的值! JS: 1 $(document).ready(function () { 2 setTimeout(GetDate, 1000); 3 4 }); 5 6 function GetDate() { 7 $("#tbData tbody").find("tr").each(function () { 8 var prjectBalanceObj = $(this).find("td:eq(3)");

Nodejs - 框架类库 - Nodejs异步流程控制Async

简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections each: 如果想对同一个集合中的所有元素都执行同一个异步操作. 1 var async = require('async'); 2 3 var t = require('./t'); 4 var log = t.log; 5 6 /** 7 * 8 * async提供了三种方式: 9 * 1. 集

android内部培训视频_第四节(1)_异步网络操作

第四节(1):异步网络操作  一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMap(下载成功后的图片) public class downloadImageTask extends AsyncTask<String, Integer, Bitmap> { /** * 在线程开始之前执行 */ @Override protected void onPreExecute() {