利用OverlappedIO读取.docx_第1页
利用OverlappedIO读取.docx_第2页
利用OverlappedIO读取.docx_第3页
利用OverlappedIO读取.docx_第4页
利用OverlappedIO读取.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从网上整理的文章,同样,这只是为了我增加理解记忆而做到得笔记,不存在利用价值,纯粹是学习和记忆.抄袭也好学习也好只是让人明白道理.主要干活的还是自己的程序.I/O设备处理必然让主程序停下来干等I/O的完成,对这个问题有方法一:使用另一个线程进行I/O。这个方案可行,但是麻烦。方法二:使用overlapped I/O。 正如书上所说:“overlapped I/O是WIN32的一项技术, 你可以要求操作系统为你传送数据,并且在传送完毕时通知你。 这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。 事实上,操作系统内部正是以线程来I/O完成overlapped I/O。 你可以获得线程的所有利益,而不需付出什么痛苦的代价”。 怎样使用overlapped I/O:进行I/O操作时,指定overlapped方式使用CreateFile (),将其第6个参数指定为FILE_FLAG_OVERLAPPED,就是准备使用overlapped的方式构造或打开文件;如果采用 overlapped,那么ReadFile()、WriteFile()的第5个参数必须提供一个指针,指向一个OVERLAPPED结构。 OVERLAPPED用于记录了当前正在操作的文件一些相关信息。/功能:从指定文件的1500位置读入300个字节int main() BOOL rc; HANDLE hFile; DWORD numread; OVERLAPPED overlap; char buf512; char szPath=”x:xxxxxxxx”; /检查系统,确定是否支持overlapped,(NT以上操作系统支持OVERLAPPED) CheckOsVersion(); / 以overlapped的方式打开文件 hFile = CreateFile( szPath, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); / OVERLAPPED结构实始化为0 memset(&overlap, 0, sizeof(overlap); /指定文件位置是1500; overlap.Offset = 1500; rc = ReadFile(hFile,buf,300,&numread,&overlap); /因为是overlapped操作,ReadFile会将读文件请求放入读队列之后立即返回(false), /而不会等到文件读完才返回(true) if (rc) /文件真是被读完了,rc为true / 或当数据被放入cache中,或操作系统认为它可以很快速地取得数据,rc为true else if (GetLastError() = ERROR_IO_PENDING) /当错误是ERROR_IO_PENDING,那意味着读文件的操作还在进行中 /等候,直到文件读完 WaitForSingleObject(hFile, INFINITE); rc = GetOverlappedResult(hFile,&overlap,&numread,FALSE); /上面二条语句完成的功能与下面一条语句的功能等价: / GetOverlappedResult(hFile,&overlap,&numread,TRUE); else /出错了 CloseHandle(hFile); return EXIT_SUCCESS;在实际工作中,若有几个操作同一个文件时,怎么办?我们可以利用OVERLAPPED结构中提供的event来解决上面遇到的问题。注意,你所使用的event对象必须是一个MANUAL型的;否则,可能产生竞争条件。原因见书P159。int main() int i; BOOL rc; char szPath=”x:xxxxxxxx”; / 以overlapped的方式打开文件 ghFile = CreateFile( szPath, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); for (i=0; iMAX_REQUESTS; i+) /将同一文件按几个部分按overlapped方式同时读 /注意看QueueRequest函数是如何运做的,每次读16384个块 QueueRequest(i, i*16384, READ_SIZE); / 等候所有操作结束; /隐含条件:当一个操作完成时,其对应的event对象会被激活 WaitForMultipleObjects(MAX_REQUESTS, ghEvents, TRUE, INFINITE); / 收尾操作 for (i=0; iMAX_REQUESTS; i+) DWORD dwNumread; rc = GetOverlappedResult( ghFile, &gOverlappedi, &dwNumread, FALSE ); CloseHandle(gOverlappedi.hEvent); CloseHandle(ghFile); return EXIT_SUCCESS;/当读操作完成以后,gOverlappednIndex.hEvent会系统被激发int QueueRequest(int nIndex, DWORD dwLocation, DWORD dwAmount) /构造一个MANUAL型的event对象 ghEventsnIndex = CreateEvent(NULL, TRUE, FALSE, NULL); /将此event对象置入OVERLAPPED结构 gOverlappednIndex.hEvent = ghEventsnIndex; gOverlappednIndex.Offset = dwLocation; for (i=0; iMAX_TRY_COUNT; i+) /文件ghFile唯一 rc = ReadFile(ghFile, gBuffersnIndex,&dwNumread,&gOverlappednIndex); if (rc) return TRUE; err = GetLastError(); if (err = ERROR_IO_PENDING) /当错误是ERROR_IO_PENDING,那意味着读文件的操作还在进行中 return TRUE; / 处理一些可恢复的错误 if ( err = ERROR_INVALID_USER_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论