win32多线程-异步(asynchronous) I/O

VC++串口通信实战:从Win32 API到异步I/O的完整实现 串口通信作为嵌入式开发、工业控制等领域中设备与上位机交互的基础协议,其核心在于实现稳定、高效的数据传输。在Windows平台上,系统通过文件I/O模型将串口抽象为特殊文件,开发者可使用CreateFile、ReadFile等Win32 API直接操作。异步I/O(重叠I/O)模型相比同步I/O能显著提升效率,它允许单线程管理多个I/O操作,通过事件机制实现非阻塞通信,这是构建高性能串口应用的关键。在实际工程中,结合环形缓冲区管理、线程安全设计和流控制等优化技巧,可以确保通信的稳定性和实时性。本文以VC++为 阅读详情

        I/O设备是个慢速设备,无论打印机、调制解调器,甚至硬盘,与CPU相比都奇慢无比,坐下来干等I/O的完成是一件不甚明智事情。

        异步(asynchronous) I/O在win32多线程程序设计中被称为overlapped I/O,是win32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以多线程完成overlapped I/O,你可以获得线程的所有利益,而不需要付出什么痛苦代价。

异步(asynchronous) I/O事例:

/*
 * IoByEvnt.c
 *
 * Sample code for Multithreading Applications in Win32
 * This is from Chapter 6, Listing 6-2
 *
 * Demonstrates how to use event objects instead of
 * file handles to signal multiple outstanding
 * overlapped operation on a file.
 */

#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "MtVerify.h"

//
// Constants
//
#define MAX_REQUESTS    5
#define READ_SIZE       512
#define MAX_TRY_COUNT   5

//
// Function prototypes
//
int QueueRequest(int nIndex, DWORD dwLocation, DWORD dwAmount);
void CheckOsVersion();


//
// Global variables
//

// Need to keep the events in their own array
// so we can wait on them.
HANDLE  ghEvents[MAX_REQUESTS];
// Keep track of each individual I/O operation
OVERLAPPED gOverlapped[MAX_REQUESTS];
// Handle to the file of interest.
HANDLE ghFile;
// Need a place to put all this data
char gBuffers[MAX_REQUESTS][READ_SIZE];


int main()
{
    int i;
    BOOL rc;
    char szPath[MAX_PATH];

    CheckOsVersion();

    GetWindowsDirectory(szPath, sizeof(szPath));
    strcat(szPath, "\\WINHLP32.EXE");
    // Open the file for overlapped reads
    ghFile = CreateFile( szPath,
                    GENERIC_READ,
                    FILE_SHARE_READ|FILE_SHARE_WRITE,
                    NULL,
                    OPEN_EXISTING,
                    FILE_FLAG_OVERLAPPED,
                    NULL
                );
    if (ghFile == INVALID_HANDLE_VALUE)
    {
        printf("Could not open %s\n", szPath);
        return -1;
    }

    for (i=0; i<MAX_REQUESTS; i++)
    {
        // Read some bytes every few K
        QueueRequest(i, i*16384, READ_SIZE);
    }

    printf("QUEUED!!\n");

    // Wait for all the operations to complete.
    MTVERIFY( WaitForMultipleObjects(
               MAX_REQUESTS, ghEvents, TRUE, INFINITE
        ) != WAIT_FAILED );

    // Describe what just happened.
    for (i=0; i<MAX_REQUESTS; i++)
    {
        DWORD dwNumread;

        rc = GetOverlappedResult(
                                ghFile,
                                &gOverlapped[i],
                                &dwNumread,
                                FALSE
                            );
		/************************************************************************/
		/*调用GetOverlappedResult(),你获得的结果和“调用ReadFile()或WriteFile()而没有
		指定overlapped I/O”所返回的东西一样,这个函数的价值在于,在文件操作真正完成之前,
		你不可能确实知道它是否成功。
		如果overlapped操作成功,此函数传回TRUE,失败则传回FALS。
		如果GetOverlappedResult(,,, BOOL bWait)中的bWait为FALSE而overlapped还是没有完成,
		GetLastError()返回ERROR_IO_INCOMPLETE.									*/
		/************************************************************************/
        printf("Read #%d returned %d. %d bytes were read.\n",
                    i, rc, dwNumread);
        CloseHandle(gOverlapped[i].hEvent);
    }

    CloseHandle(ghFile);

	getchar();
    return EXIT_SUCCESS;
}


/*
 * Call ReadFile to start an overlapped request.
 * Make sure we handle errors that are recoverable.
 * Properly set up the event object for this operation.
 */
int QueueRequest(int nIndex, DWORD dwLocation, DWORD dwAmount)
{
    int i;
    BOOL rc;
    DWORD dwNumread;
    DWORD err;

    MTVERIFY(
        ghEvents[nIndex] = CreateEvent(
                     NULL,    // No security
                     TRUE,    // Manual reset - extremely important!
                     FALSE,   // Initially set Event to non-signaled state
                     NULL     // No name
                    )
    );
    gOverlapped[nIndex].hEvent = ghEvents[nIndex];
    gOverlapped[nIndex].Offset = dwLocation;

    for (i=0; i<MAX_TRY_COUNT; i++)
    {
        rc = ReadFile(
            ghFile,
            gBuffers[nIndex],
            dwAmount,
            &dwNumread,
            &gOverlapped[nIndex]
        );

        // Handle success
        if (rc)
        {
            printf("Read #%d completed immediately.\n", nIndex);
            return TRUE;
        }

        err = GetLastError();

        // Handle the error that isn't an error. rc is zero here.
        if (err == ERROR_IO_PENDING)
        {
            // asynchronous i/o is still in progress 
            printf("Read #%d queued for overlapped I/O.\n", nIndex);
            return TRUE;
        }

        // Handle recoverable error
        if ( err == ERROR_INVALID_USER_BUFFER ||
             err == ERROR_NOT_ENOUGH_QUOTA ||
             err == ERROR_NOT_ENOUGH_MEMORY )
        {
            Sleep(50);  // Wait around and try later
            continue;
        }

        // Give up on fatal error.
        break;
    }

    printf("ReadFile failed.\n");
    return -1;
}


//
// Make sure we are running under an operating
// system that supports overlapped I/O to files.
//
void CheckOsVersion()
{
    OSVERSIONINFO   ver;
    BOOL            bResult;

    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    bResult = GetVersionEx((LPOSVERSIONINFO) &ver);

    if ( (!bResult) ||
         (ver.dwPlatformId != VER_PLATFORM_WIN32_NT) )
    {
        fprintf(stderr, "IoByEvnt must be run under Windows NT.\n");
		exit(EXIT_FAILURE);
    }

}

MtVerify.h头文件见-----win32多线程-新版本MtVerify.h

《Win32多线程程序设计》(12)---overlapped I/O 文字版电子书-----请点击这里 overlapped I/O  是Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O 进行过程中仍然能够继续处理事务。 i 激发的文件handles i 激发的event  对象 i 异步过程调用(Asynchronous Procedure Calls,APCs) i I/O comple 阅读详情

相关推荐

深入Windows RS232串口编程:从API原理到异步I/O实战

串口通信作为嵌入式、工控和仪器仪表领域的基础通讯方式,其核心在于实现设备间的可靠数据交换。其工作原理基于异步串行传输协议,通过配置波特率、数据位和校验位等参数确保数据准确收发。掌握底层串口编程技术,对于开发高可靠性的数据采集、设备控制和工业自动化系统具有重要价值。在实际应用中,开发者常需处理二进制数据帧、超时机制和复杂的硬件握手信号。本文聚焦于Windows平台,通过解析CreateFile、ReadFile、WriteFile等核心API,并深入探讨异步重叠I/O(Overlapped I/O)模式,指导

weixin_30764771的博客 508

windows创建线程、IO模型、同步异步

一、线程创建函数CreateThread() 参考:https://www.cnblogs.com/ay-a/p/8762951.html 头文件:#include&amp;amp;amp;lt;windows.h&amp;amp;amp;gt; 原型: HANDLE WINAPI CreateThread() 参数6个: 默认值 代表含义 安全性 NULL 线程安全,不被继承 栈空间 ...

xiongluo0628的博客 1339

35、异步 I/O 编程全解析:从 Win32 到 .NET 的深入探索

本文全面解析了异步I/O编程的核心概念、实现机制以及从Win32到.NET平台的具体应用。内容涵盖异步I/O的优势、重叠I/O模型、完成机制、缓冲区与线程池优化策略、错误处理方式以及在实际项目中的应用案例,帮助开发者深入理解并高效应用异步I/O技术,提升程序性能与可扩展性。

bert9linguist的博客 64

C# Windows 异步线程

Taskt=newTask(newAction(()=> { //推送产品 PushProduct(mPromoteSet,promoteId); })); ...

weixin_30379531的博客 147

WIN32API串口异步通信实例

vs2010下WIN32API函数实现的异步mfc窗口串口通信实例,里面有很详细的注释和函数解释,程序流程我也写下来了,对初学串口很有帮助

一个Win32 Socket的基于异步套接字多线程程序

这是一个基于Windows Socket网络编程的一个Win32控制台程序,通过使用异步模式实现服务器端和客户端的通信,服务器端注册套接字读事件,负责在套接字上接收数据,客户端注册发送事件,负责向服务器端发送数据,

Win32多线程 -- 异步IO(overlapped IO)

一. 异步(overlapped) IO之被激发的File Handle 1.1Win32 IO操作函数 Win32 之中有三个基本的函数用来执行 I/O CreateFile() ReadFile() WriteFile() 没有另外哪一个函数用来关闭文件,只要调用 CloseHandle 即可。 CreateFile 可以用来打开各式各样的资源,包括(但不限制于): -> 文件(硬盘、软盘、光盘或其他) -> 串行口和并行口(serial a...

cfz751740465的博客 1826

基于Win32线程池API的异步执行程序-Rust开发

基于Win32线程池API的异步执行程序基于Win32线程池API的异步执行程序使用futures :: channel :: oneshot; #[wae :: main] async fn main(){let(tx,rx)= oneshot :: channel(); let hello = wae :: spawn(异步移动{let msg = rx.await.unwrap(); println!(“ {}”,msg);}); tx.send(“问候你好!”)。unwrap(); 你好。 }

【Win32多线程】异步I/O技术(Overlapped I/O),避免使用多线程

讨论:1.激发的文件handles       2.激发的event对象       3.异步过程调用       4.I/O completion ports(重要)适用于高负载服务器 ----Win32文件操作函数      win32中有上那个基本的函数用来执行I/O,他们是:     CreateFile(),ReadFile(),WriteFile();    没有哪个

xiaoding133的专栏【Stay hungry,Stay foolish】 1万+

文华指标源码—区间彩带

这就是当年东方财富软件终端里主打经典的指标、主要揭示主力成本区域。

qq2054129753的博客 888

cosmos-curate工业级视频数据预处理引擎/终端用户指南( end-user-guide)

摘要:Cosmos-Curate是一个用于视频和自动驾驶数据处理的开源工具,提供从本地到集群的完整部署方案。文档针对三类用户:终端用户(配置运行现有管道)、开发者(修改/创建管道)和贡献者(改进代码库)。核心功能包括容器化设计(Docker+NVIDIA工具链)、多平台支持(本地/Slurm/云)、集成HuggingFace/NGC模型,以及可扩展的管道架构。使用需满足硬件(如Ampere架构GPU)和软件(Ubuntu22.04+Python3.10)要求,通过CLI工具构建镜像、下载模型并运行示例管道(

qq_45053161的博客 1202

stm32学习笔记 -根据外接存储器时序初始化FSMC结构体

文章目录FSMC结构体FSMC_NORSRAMTimingInitTypeDef 结构体FSMC_NORSRAMInitTypeDef 结构体配置SRAM总结 FSMC结构体 控制FSMC使用SRAM存储器时主要是配置时序寄存器以及控制寄存 器,利用ST标准库的SRAM时序结构体以及初始化结构体可以很方便地写入参 数。 时序结构体: FSMC_ NORSRAMTimingInitTypeDef 初...

某风吾起的博客 7012

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2496

设备I/O之OVERLAPPED

OVERLAPPED,顾名思义为重叠,乍一看会很奇怪,重叠?谁跟谁重叠?似乎在WIN32的Programming中没有这个概念呀?要讨论这个问题就要追溯到对设备I/O的访问中  在WIN32中,用户不能象以前那样直接对硬件进行访问,使得这一层对开发者而言是个"黑盒",而是提供了一组对应的API的接口.让开发者基于提供的接口进行开发,而把低层的访问交给了Driver或者内核.  在WIN32中,设备

龙虾的博客 2978

35、使用 Geo 创建 GitLab 的分布式只读副本

本文详细介绍了如何使用GitLab Geo功能创建分布式只读副本,涵盖数据库主从配置、SSH密钥查找方式更改、通过Web UI添加从节点、激活哈希存储及状态检查等关键步骤。同时提供了常见问题解答和配置流程图,帮助用户快速部署并维护Geo集群,实现跨地域的高效数据同步与高可用架构。

chair的专栏 81

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

Win 32 多线程程序设计学习笔记之六:异步I/O(Overlapped I/O)

某些时候 overlapped I/O 可以取代多线程的功用。然而,overlapped I/O 加上completion ports,常被设计为多线程处理,以便在一个“受制于 I/O 的程序”(所谓 I/O bound 程序)中获得高效率。         overlapped I/O 是 Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/

1541

Python与CAD系列基础篇(十)图形复制、移动、删除

①通过pyautocad连接AutoCAD进行处理②通过ezdxf处理dxf格式文件。进行图形复制、移动、删除的方法。pyautocad方式。pyautocad方式。

weixin_43894929的博客 2210

asynchronous I/O——异步I/O

Overlapped I/O,也就是asynchronous I/O——异步I/O。         目前所有外设的速度(包括硬盘)跟CPU的速度相比仍然是天壤之别,而程序跟外设打交道又是非常正常的事情,因此如何让程序既能进行I/O又不受制于 I/O速度瓶颈的限制是一大课题。而采取异步方式则是一种自然而且有效的方案。也就是说我们调用I/O函数后立即返回继续往下执行,而不必等I/O完成后 再继

机器视觉之家 1367

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3153

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的插件:I2 Localization 。

努力前行,总会成为自己心中的那道光 3万+

asynchronous i/o

转载:Overlapped I/O,也就是asynchronous I/O——异步I/O。        目前所有外设的速度(包括硬盘)跟CPU的速度相比仍然是天壤之别,而程序跟外设打交道又是非常正常的事情,因此如何让程序既能进行I/O又不受制于 I/O速度瓶颈的限制是一大课题。而采取异步方式则是一种自然而且有效的方案。也就是说我们调用I/O函数后立即返回继续往下执行,而不必等I/O完成后 再继续

百里鹤的专栏 2009

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入解析 go-winio:Go 语言在 Windows 平台上高性能 Win32 I/O 工具库

> 本文基于 buildah 仓库 `vendor/github.com/Microsoft/go-winio` 目录下完整 vendor 的第三方依赖源码与其 [README.md](https://link.gitcode.com/i/091b54655414822e9dce8f288f03810c) 编写,聚焦 go-winio 库的设计原理、命名管道(Named Pipe)实现、备份/恢复

gitblog_00412的博客 891

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Overlapped I/O模型深度解析:从理论到实践实现

为了克服传统阻塞I/O的瓶颈,overlapped I/O作为一种异步I/O技术应运而生。它允许I/O操作在后台进行,而不阻塞调用线程。应用程序可以继续执行其他任务,直到I/O操作完成。

和舒貌的博客 1253

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: windows核心编程-信号量(semaphore)
下一篇: win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
codinglf
博客等级 码龄16年 237粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值