设备I/O之OVERLAPPED

OVERLAPPED,顾名思义为重叠,乍一看会很奇怪,重叠?谁跟谁重叠?似乎在WIN32的Programming中没有这个概念呀?要讨论这个问题就要追溯到对设备I/O的访问中。

     在WIN32中,用户不能象以前那样直接对硬件进行访问,使得这一层对开发者而言是个"黑盒",而提供了一组对应的API的接口.让开发者基于提供的接口进行开发,而把低层的访问交给了Driver或者内核.在WIN32中,设备的概念已经远远超过了Moniter,Printer等的范围,大概可以包括文件,目录,串口,并口,管道以及控制台等.很自然的,当我们要访问这个设备的时候,我们的第一步就是打开这个设备,其中WIN32 API提供的是CreateFile,具体的使用可以参考MSDN,其中包括的一些参数表明了是否这个设备已经存在(dwCreationDisposition),是否以独占的方式(dwShareMode)打开等等.这里大家可能已经产生了这个想法:呀,既然是跟设备打交道,那么设备的速度这么慢,而CPU的速度这么快,这两者应该怎么协调好呢?举个例子说,我要访问软盘上的资料,哪怕它是一秒后就读出来了,那其实对CPU也是一种很大的浪费呀.是的,的确会有这个问题,既然有问题,我们就要解决,而MicroSoft的解决方式就是这里我们的讨论题目:OverLapped这个字符到底是什么含义呢?其实它的意思就是当程序在等待设备操作的时候,可以继续往下做而不必阻塞到那个地方等待设备操作的返回,这就造成了程序运行和设备操作时间上的重叠.是的,是这样的,神奇吧,那么程序该怎么知道设备操作什么时候做完了返回了呢...

     讲到这个地方,我们又要引入多线程的概念了.其实相信大家对多线程都有了一定的了解,其实多线程主要就是一个同步的问题,如何协调好这些"跑起来就不羁"的线程,WIN32提供给我们的是WaitForSingleObject和WaitForMultiObject这两个函数,而WIN32中提供了一组专门用来同步的对象包括Critical Section,Mutex,Semaphore,Event等,这其中的绝大多数都属于内核对象(Kernal Object),其中这些对象与一般对象的最大区别就是他们是属于系统内核维护的一块数据结构.程序不能直接访问他们.这些对象都具备两种形态,这里我们不妨称之为:有信号的和无信号的.这样当我们使用Wait函数的时候,就可以根据信号的有无来使得程序是否阻塞在wait的地方,简单的说,就是当我们调用一个函数:WaiForSingObject(Event a);的时候,如果a事件有信号,那么程序就往下跑,如果是无信号的,那么程序就阻塞在当前位置,等待其变为有信号的.举个形象的粒子,比如线程是个在高速公路上跑的汽车,Wait函数的作用就是让这辆汽车开到一个十字路口,等待路口的信号灯是否为绿色的,如果是那么汽车接着往下跑,否则对不起,请等在那边等信号灯变为绿色..

  在这里,我使用下来最方便的就是Event这个对象了,因为我们可以很方便的对它进行操作,比如SetEvent使的它变为有信号的,而ResetEvent使得它变为无信号的,当然其他的一些比如Mutex在使得程序不能重复加载等地方也很方便..

  这样当我们想要异步的(OVERLAPPED)访问设备的时候,只要首先在CreataFile的时候用上(OVERLAPPED)标志,然后在读写操作(对应的是WriteFile和ReadFile)的时候同样使用这个标志即可...

  看看下面这段:

       

1处        以重叠方式接收指定字符,看函数是否读取成功

        fReadStat=ReadFile(hCom,lpBlock,dwLength,&dwLength,&osRead);

        if(!fReadStat)

        {

            file://属重叠方式操作在后台进行的情况设备I/O之OVERLAPPED [转]  - qdslg - qdslg的博客

            if(GetLastError()==ERROR_IO_PENDING)

            {

2处               

                file://等待1s,若接收事件处于信号态,说明重叠方式操作完成,超时设备I/O之OVERLAPPED [转]  - qdslg - qdslg的博客

3处                if(WaitForSingleObject(osRead.hEvent,1000)==WAIT_TIMEOUT)

                    dwLength=0;

            }

            else dwLength=0;//异常情况

        }

    这样当程序在用异步的方式读取资料的时候,不管设备有没有操作完,程序会立即往下跑而不用等待其返回(如果是同步的那线程就会阻塞在这个地方).这样我们在2处的地方就可以自己做自己的事情而不用去管设备(这样也就实现了时间上的重叠),直到我们需要等待3处资料进来后再做进一步的处理的时候,我们才会用上

那句WaitFor等待设备..

    这样的操作无疑提高了效率,使得程序和设备的配合协调了不少,当然OVERLAPPED里面是自己新开了线程来处理,这是毫无疑问的...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】在windows上安装VTK

看了很多教程,花了1天半的时间装上了,记录下。 前置条件:我安装了VS2015,用来编译工程。 参考资料 官方:http://www.vtk.org/Wiki/VTK/Building 安装:http://blog.csdn.net/Chinamming/article/details/1…

映射网络驱动器后为什么每次都要重新连接_如何映射网络驱动器?

有些设备的电脑需要处理一些共享资料或者需要一些外部资料才能生产运行,但是这些资料在本电脑没有,要去企业的公共盘(共享磁盘)里面获取,公共盘是网络上驱动器,这时候我们就要把公共盘映射到本地电脑。PCB厂…

解析 Linux 中的 VFS 文件系统机制

简介: 本文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2.4.20 内核。总体上说 Linux 下的文件系统主要可分为三大块:一是上层的文件系统的系统调用,二是虚拟文件系统 VFS(Virtual Filesystem Switch),三是挂…

去除分页预览

有时我们在打开一个Excel表的时候,会出现如下图样式: 此为作了"分页预览"设置,取消方法如下图: 选择"普通"即可转载于:https://www.cnblogs.com/wxbbk/archive/2007/10/07/915773.html

【转】VTK + QT + VS 编译安装配置

VTK Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C构建的,包含有大约250,000行代码&#…

用Linq转换数据

Linq的好处不用多说。由于它能Linq TO XXX,所以用它进行XXX数据类型之间的转换也是非常惬意的事情。 转载于:https://www.cnblogs.com/think/archive/2007/10/26/Linq1.html

【转】我的CV之路第一篇:ITK是啥?

Itk篇 (Insight Segmentation and Registration Toolkit)ITK Itk篇前言一、ITK是什么?二、一些函数 1.读/写图片2.滤波器 前言 学习医疗图像分割过程中,遇到了很多困难,英文文献,数学基础,图像…

【转】二、VTK用于QT的安装

一、说明 本文的主要目的是在说明通过Cmake重新编译VTK,使得其能够与QT交互使用 二、VTK的安装 VTK版本:8.2.0 VS版本2019 电脑:win-64bit 需要软件:CMake(我使用的版本是3.16.0) 三、过程 大概过程分为以下几个步骤: 1、下载vt…

【转】一、用于VS2019的QT配置

转自:https://www.cnblogs.com/fantianliang/p/12355973.html 一、前言 本期间的主要目的是最后能够使用VS开发关于QT为界面的程序,同时能够使用VTK和ITK程序,这是第一部分。 因为之前查看的有关博客随着时间没有跟随版本变化,所…

IIS 7.0探索用于 Windows Vista 的 Web 服务器和更多内容

我经常听到 Microsoft 内部和外部的人将新的 IIS 7.0 Web 服务器称为 Microsoft 在过去几年中所进行的最重要的开发工作之一。考虑到 Microsoft 最近推出了一系列引人注意的技术,包括 Windows Vista™,这个评语具有重要意义! IIS 7.0 的发布时…

【转】三、QT例子-打开一个图片并且显示

一、前言 本博客的主要目的在于对QT有进一步的了解,单纯只使用QT。 今天小例子主要是打开图片,然后显示出来,并且显示图片的路径。 二、工程建立 1、参考前面 博客一QT安装过程里面的例子, 建立一个QT GUI Application 2、打开.u…

【转】四、关于如何使用软件库的一个技巧-避免重复配置属性表

一、前言 我们需要使用各种函数库,比如Opencv,Itk, vtk,当不同的函数库使用的时候,在VS配置属性是一个很麻烦的问题,并且设计到不同函数库的交叉使用,所以这里提供一个小技巧。 那就是我们把每一个函数库的配置为属性表的形式&…

Ajax Extensions核心控件介绍

摘自:http://www.cnblogs.com/remember515/archive/2007/06/28/799030.html Ajax的核心组件包括ScriptManager、ScriptManagerProxy、UpdatePanel、Timer、UpdateProgress,其相关属性如下:updatePanel控件UpdatePanel主要属性 UpdateMode 内容模板的更…

【转】五、VTK读取图片,然后QT显示

一、前言 今天实现的主要功能是通过vtk读取jpg图片(只能够读取.jpg文件),然后通过QT显示出来,整个程序的框架是QT GUIApplication 版本: VS2019VTK8.2.0QT5.13.1版本配置 VS 为release x64(这个是工程建立的时候设置的解决方案属性&#xff…

用java查询excel表格_如何把java查询出的内容导入到excel表格

展开全部java查询出的内容导入到excel表格/**导出数据为XLS格式* param fos* param bo*/public void writeExcelBo(FileOutputStream fos, java.util.Vector ve){jxl.write.WritableWorkbook wwb;try{wwb Workbook.createWorkbook(fos);jxl.write.WritableSheet ws wwb.createS…

【转】C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁

转自:https://www.cnblogs.com/marvin/p/PutDllToSpecificFolder.html?utm_sourcetuicool&utm_mediumreferral 系列文章 C#开发奇技淫巧一:调试windows系统服务C#开发奇技淫巧二:根据dll文件加载C或者Delphi插件C#开发奇技淫巧三&#…

【转】C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

这两天忙着把框架改为支持加载C和Delphi的插件,来不及更新blog了。 原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可。但是公司不是所有人都搞C#,也不是所有的程序C#都能很好的完成,又或者其他公司…

【转】一篇易懂的CAN通讯协议指南1

转自:https://zhuanlan.zhihu.com/p/162708070 本文力求以图文并茂来接好CAN通讯协议的基础知识,希望能给有兴趣的朋友带来一些收获。 为了便于大家理解与接受,请先看一幅图: 图1 电话会议 简单地讲CAN总线就如上图1中两根粗黄线…

【转】CAN协议深度解析-简单易懂协议详解

转自:https://zhuanlan.zhihu.com/p/343607068 CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧。 扩展帧的仲裁域有29位,可以出现2^29中报文&…

深度神经网络下的风格迁移模型(C#)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 这个是C#版本的,这里就只放出代码。VB.Net版本请参看 深度神经网络下的风格迁移模型-CSDN博客 斯坦福大学李飞飞团队的…