异步io中用WaitforsingleOjbect是不是个有问题的设计
- C/C++ code
#include<windows.h>#include <stdio.h>int main(){#define BUFFER_SIZE 1024*1024*1024 //1GB char buf[BUFFER_SIZE]; HANDLE hfile; OVERLAPPED ol; //初始化 memset(buf,0,BUFFER_SIZE); memset(&ol,0,sizeof(ol)); hfile=CreateFile("g:\\VS2012_RC_ULT_CHS.iso", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL ); if(INVALID_HANDLE_VALUE==hfile) { printf("opend file erorr\n"); return -1; } ol.Offset=0; DWORD numRead; BOOL bRet=ReadFile(hfile,buf,BUFFER_SIZE,&numRead,&ol); if(bRet) { } else { if(ERROR_IO_PENDING==GetLastError()) //说明在读 { //难道我在这里等待吗?? 等待岂不是傻乎? WaitForSingleObject(hfile,-1); //等多久?? //查询结果 bRet=GetOverlappedResult(hfile,&ol,&numRead,TRUE); if(TRUE==bRet) //读取完毕 { } else //出错了 { } } } CloseHandle(hfile); return 0; }
异步肯定要比同步好, 如果不好,设计它就是吃多了,
我提供的代码, 大家看吧,用了WaitforSingleObject,不用不行,不知道什么时候读取完毕?
可是用了, 和同步有什么区别,不也得等待, 这不是扯嘛?
问题2:为什么说 重叠io有事件对象这东西,我的代码里怎么没有??
[解决办法]
支持楼上,异步和同步的却别 很大 ,处理方式 也 大不相同 ,不知道 楼主 用过 WinINet 没有, 简单的 说 同步是要 一直 阻塞下去 ,而异步 是 直接 返回 ,但是在 另一个线程中进行处理结果,或者是在回调函数中 进行处理结果 。