设为首页 收藏本站
查看: 979|回复: 0

[经验分享] 《Windows核心编程系列》十谈谈????同步设备IO与异步设备IO之异步IO

[复制链接]

尚未签到

发表于 2015-12-16 08:18:17 | 显示全部楼层 |阅读模式
http://blog.csdn.net/chenlycly/article/details/7836973 在Windows中,使用SendMessage来发送同步消息,使用PostMessage来发送异步消息。二者的区别在于:SendMessage将消息发给一个窗口,等窗口程序处理完成后才返回;PostMessage则是将消息发到线程的消息队列中,立即返回,不需要等窗口程序处理完成后再返回。SendMessage由于要等到消息被处理后才会返回,所以能保证消息能立即被处理,但可能导致调用函数的“堵塞”;PostMessage由于是将消息放到消息队列中,不能保证消息被立即处理,好处是会立即返回,不会造成函数的拥塞。

       一般在回调函数中要使用PostMessage,以保证回调函数的即时执行,从而使回调函数提供者的代码执行不被拥塞。再就是在有的代码中,我们调用系统api实现预定的功能,但api函数内部使用的是,而后续操作需要在api函数起效果后在执行,即要保证消息按先后线性顺序被处理,所以后续操作需要使用PostMessage来处理,以最终实现我们所需要的功能。

http://blog.csdn.net/ithzhang/article/details/8316171        
         
                                     同步设备IO与异步设备IO之异步IO介绍



[cpp] view plaincopy

  • typedef struct _OVERLAPPED  
  •   
  • {  
  •   
  •    DWORD Internal;//错误代码。  
  •   
  •    DWORD InternalHigh;//已传输字节数。  
  •   
  •    DWORD Offset;//低32位文件偏移。  
  •   
  •    DWORD OffsetHigh;//高32位文件偏移。  
  •   
  •    HANDLE hEvent;//事件对象句柄。  
  •   
  • }OVERLAPPED,*LPOVERLAPPED;  





[cpp] view plaincopy

  • #define HasOverlappedIoCompeleted(pOverlapped)\  
  •   
  •   ((pOverlapped)->Internal!=STATUS_PENDING)  





[cpp] view plaincopy

  • OVERLAPPED o1={0};  
  •   
  • OVERLAPPED o2={0};  
  •   
  • BYTE buff[1024];  
  •   
  • ReadFile(hFile,buff,100,NULL,&o1);  
  •   
  • WriteFile(hFile,buff,100,NULL,&o2);  





[cpp] view plaincopy

  • VOID ReadData(HANDLE hFile)  
  •   
  • {  
  •   
  •    OVERLAPPED o={0};  
  •   
  •    BYTE buff[100];  
  •   
  •    ReadFile(hFile,buff,100,NULL,&o);  
  •   
  • }  





[cpp] view plaincopy

  • BOOL CancelIo(HANDLE hFile);  





[cpp] view plaincopy

  • BOOL CancelIoEx(HANDLE hFile,LPOVERLAPPED pOverlapped);  






[cpp] view plaincopy

  • HANDLE hFile=CreateFile(...,FILE_FLAG_OVERLAPPED,...);  
  •   
  • BYTE buff[1000];  
  •   
  • OVERLAPPED o={0};  
  •   
  • o.Offset=345;  
  •   
  •   
  • BOOL bReadDone=ReadFile(hFile,bBuff,100,NULL,&o);//异步则返回false.  
  •   
  • DWORD ret=GetLastError();//异步则返回ERROR_IO_PENDIN。  
  •   
  • if(!bReadDone&&(ret==ERROR_IO_PENDING))//以异步IO执行。  
  •   
  • {  
  •   
  •    WaitForSingleObject(hFile,INFINITE);  
  •   
  • }  





[cpp] view plaincopy

  • BOOL ReadFileEx(  
  •   
  •       HANDLE hFile,  
  •   
  •       PVOID pvBuffer,  
  •   
  •       DWORD nNumBytesToRead,  
  •   
  •       OVERLAPPED*pOverlapped,  
  •   
  •       LPOVERLAPPED_COMPLETION_ROUTINE pfnCompletionRoutine);  
  •   
  • BOOL WriteFileEx(  
  •   
  •       HANDLE hFile,  
  •   
  •       PVOID pvBuffer,  
  •   
  •       DWORD nNumBytesToRead,  
  •   
  •       OVERLAPPED*pOverlapped,  
  •   
  •       LPOVERLAPPED_COMPLETION_ROUTINE pfnCompletionRoutine);  





[cpp] view plaincopy

  • VOID WINAPI CompletionRoutine(  
  •   
  •      DWORD dwError,  
  •   
  •      DWORD dwNumBytes,  
  •   
  •      OVERLAPPED*po);  





[cpp] view plaincopy

  • DWORD SleepEx(  
  •   
  •      DWORD dwMilliSeconds,  
  •   
  •      BOOL bAlertable);  
  •   
  • DWORD WaitForSingleObjectEx(  
  •   
  •      HANDLE hObject,  
  •   
  •      CONST HANDLE*phObjects,  
  •   
  •      BOOL bWaitAll,  
  •   
  •      BOOL dwMilliseconds,  
  •   
  •      BOOL bAlertable);  
  •   
  • BOOL GetQueuedCompletionStatusEx(  
  •   
  •      HANDLE hCompPort,  
  •   
  •      LPOVERLAPPED_ENTRY pCompPortEntries,  
  •   
  •      DWORD dwMilliSeconds,  
  •   
  •      BOOL aAlertable);  
  •   
  • BOOL GetQueuedCompletionStatusEx(  
  •   
  •      HANDLE hCompPort,  
  •   
  •      LPOVERlAPPEDENTRY pCompPortEntries,  
  •   
  •      ULONG ulCount,  
  •   
  •      PULONG pulNumNumEntriesRemoved,  
  •   
  •      BOOL bAlertable);  
  •   
  • DWORD MsgWaitForMultipleObjectEx(  
  •   
  •      DWORD nCount,  
  •   
  •      CONST HANDLE *pHandles,  
  •   
  •      DWORD dwMilliseconds,  
  •   
  •      DWORD dwWakeMask,  
  •   
  •      DWORD dwFlags);  






[cpp] view plaincopy

  • DWORD QueueUserAPC(  
  •   
  •      PAPCFUNC pfnAPC,  
  •   
  •      HANDLE hThread,  
  •   
  •      ULONG_PTR dwData);  





[cpp] view plaincopy

  • VOID WINAPI APCFUNC(ULONG_PTR dwParam);  




[cpp] view plaincopy

  • VOID WINAPI APCFunc(ULONG_PTR dwParam)  
  •   
  • {}  
  •   
  • UINT WINAPI ThreadFunc(PVOID pvParam)  
  •   
  • {  
  •   
  •     HANDLE hEvent=(HANDLE)pvParam;  
  •   
  •   DWORD dw=WaitForSingleObjectEx(hEvent,INFINITE,true);  
  •   
  •    if(dw==WAIT_OBJEC_0)//事件内核对象被触发。  
  •    {  
  •   
  •    }  
  •   
  •     if(dw==WAIT_IO_COMPLETION)//线程退出。  
  •     {  
  •   
  •      return 0;  
  •   
  •     }  
  •   
  • }  



        下一节将会介绍Windows完成端口。


   本文参考自《Windows核心编程》第五版第二部分。如有错误,请不吝赐教!!!
                    2012.12.18 20:52于山西大同

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151734-1-1.html 上篇帖子: Windows Server Nano 安装 下篇帖子: Windows异步I/O和完成端口
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表