首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

《Windows核心编程系列》10异步IO之IO完成端口

2013-01-23 
《Windows核心编程系列》十异步IO之IO完成端口http://blog.csdn.net/ithzhang/article/details/8508161转载

《Windows核心编程系列》十异步IO之IO完成端口

              http://blog.csdn.net/ithzhang/article/details/8508161转载请注明出处!!                                                   

                                                                 ????????????IO完成端口

HANDLE CreateIoCompletionPort( HANDLE hFile, HANDLE hExistingCompletionPort, ULONG_PTR CompletionKey, DWORD dwNumberOfConcurrentThreads);

BOOL GetQueuedCompletionStatus( HANDLE hCompletionPort, PDWORD pdwNumberOfBytesTransferred, ULONG_PTR pCompletionKey, OVERLAPPED** ppOverlapped, DWORD dwMilliSeconds);

BOOL PostQueuedCompletionStatus( HANDLE hCompletionPort, DWORD dwNumBytes, ULONG_PTR CompletionKey, OVERLAPPED*pOverlapped);

void CIOCompletionPortDlg::OnBnClickedBtnChoosefile(){// TODO: 在此添加控件通知处理程序代码CFileDialog dlg(true);dlg.DoModal();m_fileName=dlg.GetPathName();SetDlgItemText(IDC_EDIT_FILENAME,m_fileName);m_hSrcFile=CreateFile(m_fileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_FLAG_OVERLAPPED,NULL);if(m_hSrcFile==INVALID_HANDLE_VALUE){return ;}DWORD filesize;DWORD filesizeHigh;m_SrcFileSize=GetFileSize(m_hSrcFile,&filesizeHigh);DWORD t=m_SrcFileSize/1024.0;//filesize/=1024.0;CString temp;temp.Format(TEXT("%d KB"),t);SetDlgItemText(IDC_EDIT_FILESIZE,temp);}void CIOCompletionPortDlg::OnBnClickedBtnCopy(){// TODO: 在此添加控件通知处理程序代码m_hCopyThread=CreateThread(NULL,0,CopyThread,this,0,NULL);//CloseHandle(m_hCopyThread);}DWORD WINAPI CIOCompletionPortDlg::CopyThread( PVOID ppram ){CIOCompletionPortDlg *pdlg=(CIOCompletionPortDlg*)ppram;pdlg->m_hDesFile=CreateFile(TEXT("备份.exe"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_FLAG_OVERLAPPED,pdlg->m_hSrcFile);LARGE_INTEGER filesize;filesize.HighPart=0;filesize.LowPart=pdlg->m_SrcFileSize;SetFilePointerEx(pdlg->m_hDesFile,filesize,NULL,FILE_BEGIN);SetEndOfFile(pdlg->m_hDesFile);//创建IO完成端口。创建一个完成端口,将两个设备将关联到此完成端口上。HANDLE hIOCP=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,4);//创建完成端口,但不关联设备。if(hIOCP==NULL){return 0;}CreateIoCompletionPort(pdlg->m_hSrcFile,hIOCP,READ_KEY,0);//与IO完成端口关联。CreateIoCompletionPort(pdlg->m_hDesFile,hIOCP,WRITE_KEY,0);//在关联时传入了完成键。可以根据完成键来区别从完成队列中取出的请求属于哪个设备。OVERLAPPED ov={0};PostQueuedCompletionStatus(hIOCP,0,WRITE_KEY,&ov);//发送模拟完成异步IO消息。BYTE *pBuffer=new BYTE[BUFFERSIZE];OVERLAPPED ovDes={0};OVERLAPPED ovSrc={0};while(true){//memset(pBuffer,0,sizeof(pBuffer));DWORD nTransfer;OVERLAPPED *overlapped;ULONG_PTR CompletionKey;GetQueuedCompletionStatus(hIOCP,&nTransfer,&CompletionKey,(OVERLAPPED**)&overlapped,INFINITE);//IO完成队列没有请求项则挂起。否则从IO完成队列取出。switch(CompletionKey){case READ_KEY://从IO完成端口取出读完成。{ BOOL r=WriteFile(pdlg->m_hDesFile,pBuffer,overlapped->InternalHigh,NULL,&ovDes);ovDes.Offset+=BUFFERSIZE;}break;case WRITE_KEY://从IO完成队列中取出写完成。{memset(pBuffer,0,BUFFERSIZE);if(ovSrc.Offset<pdlg->m_SrcFileSize){DWORD nBytes;if(ovSrc.Offset+BUFFERSIZE<pdlg->m_SrcFileSize)nBytes=BUFFERSIZE;elsenBytes=pdlg->m_SrcFileSize-ovSrc.Offset;ReadFile(pdlg->m_hSrcFile,pBuffer,nBytes,NULL,&ovSrc);//异步IO忽略文件指针。所有对文件的定位操作由OVERLAPPED结构指定。//一定要注意为每次异步IO请求提供一个OVERLAPPED结构。刚才由于在接收和发送使用了//同一个OVERLAPPED结构,导致出现重叠 I/O 操作在进行中。错误代码:997ovSrc.Offset+=BUFFERSIZE;//OVERLAPPED的OffsetHigh结构必须每次都得设置。}else{::MessageBox(NULL,TEXT("文件复制完成"),TEXT(""),MB_OK);return 0;}}break;default:break;}}return 0;}
《Windows核心编程系列》10异步IO之IO完成端口《Windows核心编程系列》10异步IO之IO完成端口《Windows核心编程系列》10异步IO之IO完成端口

热点排行