嵌入式开发-Windows完成端口编程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows完成端口编程 目录 一 基本概念 二 OVERLAPPED数据结构 三 完成端口的内部机制 1.创建完成端口 2.完成端口线程的工作原理 3.线程间数据传递 4.线程的安全退出 一 基本概念 设备---windows操作系统上允许通信的任何东西,比如文件、目录、串行口、并行口、邮件槽、命名管道、无名管道、套接字、控制台、逻辑磁盘、物理磁盘等。绝大多数与设备打交道的函数都是CreateFile/ReadFile/WriteFile等。所以我们不能看到**File函数就只想到文件设备。 与设备通信有两种方式,同步方式和异步方式。同步方式下,当调用ReadFile函数时,函数会等待系统执行完所要求的工作,然后才返回;异步方式下,ReadFile这类函数会直接返回,系统自己去完成对设备的操作,然后以某种方式通知完成操作。 重叠I/O----顾名思义,当你调用了某个函数(比如ReadFile)就立刻返回做自己的其他动作的时候,同时系统也在对I/0设备进行你要求的操作,在这段时间内你的程序和系统的内部动作是重叠的,因此有更好的性能。所以,重叠I/O是用于异步方式下使用I/O设备的。 重叠I/O需要使用的一个非常重要的数据结构OVERLAPPED。 完成端口---是一种WINDOWS内核对象。完成端口用于异步方式的重叠I/0情况下,当然重叠I/O不一定非使用完成端口不可,还有设备内核对象、事件对象、告警I/0等。但是完成端口内部提供了线程池的管理,可以避免反复创建线程的开销,同时可以根据CPU的个数灵活的决定线程个数,而且可以让减少线程调度的次数从而提高性能。 二 OVERLAPPED数据结构 typedef strUCt _OVERLAPPED { ULONG_PTR Internal;//被系统内部赋值,用来表示系统状态 ULONG_PTR InternalHigh;// 被系统内部赋值,传输的字节数 union { struct { DWord Offset;//和OffsetHigh合成一个64位的整数,表示从文件头部的多少字节开始 DWORD OffsetHigh;//操作,如果不是对文件I/O来操作,则必须设定为0 }; PVOID Pointer; }; HANDLE hEvent;//如果不使用,就务必设为0,否则请赋一个有效的Event句柄 } OVERLAPPED, *LPOVERLAPPED; 下面是异步方式使用ReadFile的一个例子 OVERLAPPED Overlapped; Overlapped.Offset=345; Overlapped.OffsetHigh=0; Overlapped.hEvent=0; //假定其他参数都已经被初始化 ReadFile(hFile,buffer,sizeof(buffer),dwNumBytesRead,Overlapped); 这样就完成了异步方式读文件的操作,然后ReadFile函数返回,由操作系统做自己的事情吧。 下面介绍几个与OVERLAPPED结构相关的函数 等待重叠I/0操作完成的函数 BOOL GetOverlappedResult ( HANDLE hFile, LPOVERLAPPED lpOverlapped,//接受返回的重叠I/0结构 LPDWORD lpcBTransfer,//成功传输了多少字节数 BOOL fWait //TRUE当操作完成才返回,FALSE直接返回,如果操作没完成,通过调用GetLastError()函//数会返回ERROR_IO_INCOMPLETE ); 宏HasOverlappedIoCompleted可以帮助我们测试重叠I/0操作是否完成,该宏对OVERLAPPED结构的Internal成员进行了测试,查看是否等于STATUS_PENDING值。 三 完成端口的内部机制 创建完成端口 完成端口是一个内核对象,使用时他总是要和至少一个有效的设备句柄进行关联,完成端口是一个复杂的内核对象,创建它的函数是: HANDLE CreateIoCompletionPort( IN HANDLE FileHandle, IN HANDLE ExistingCompletionPort, IN ULONG_PTR CompletionKey, IN DWORD NumberOfConcurrentThreads ); 通常创建工作分两步: 第一步,创建一个新的完成端口内核对象,可以使用下面的函数: HANDLE CreateNewCompletionPo

文档评论(0)

kolr + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档