WEB开发网
开发学院软件开发VC WinInet开发中的同步和异步区别 阅读

WinInet开发中的同步和异步区别

 2008-09-05 19:25:32 来源:WEB开发网   
核心提示:同步和异步的概念在此就不啰唆了,以下载一个文件为例,WinInet开发中的同步和异步区别,我们来看看同步的做法:1)InternetOpen;2)InternetOpenUrl;3)HttpQueryInfo;4)InternetReadFile;5)InternetCloseHandle,在第2步和第4步,如果服务器

同步和异步的概念在此就不啰唆了。

以下载一个文件为例,我们来看看同步的做法:

1)InternetOpen;

2)InternetOpenUrl;

3)HttpQueryInfo;

4)InternetReadFile;

5)InternetCloseHandle。

在第2步和第4步,程序会一直等待,直到函数返回。如果要设置超时,可以使用InternetSetOption(不过好像没什么用)。在很多时候,这个函数是不合适的。比如用户主动要中断下载,却只能等待函数返回。还有,如果是大文件下载,无法想像一次读取上兆字节的数据,需使用断点续传,虽然也可以使用同步函数InternetSetFilePointer来定位网络文件读取位置,但很多服务器是不支持的。如果在手机上使用,还要考虑诸如移动网关的限制等等。

同步的好处是函数较少,流程清晰,调试也方便。

再来看看异步的做法。

1)InternetOpen,需指定是异步;

2)InternetSetStatusCallback,设置回调;

3)InternetOpenUrl,需指定回调参数;

4)WaitForSingObject或WaitForMultipleObjects,接收信号量;

5)HttpQueryInfo;

6)InternetReadFileEx,需指定回调参数;

7)WaitForSingObject或WaitForMultipleObjects,接收信号量;

8)InternetSetStatusCallback,卸载回调;

9)InternetCloseHandle。

可以看出,异步比同步要复杂了不少,重点在于回调函数。在回调中,系统会及时返回各种系统定义的HTTP消息,我们根据这些消息来设置某些信号量。在WaitForSingObject或WaitForMultipleObjects里,等待这些信号(当然也可以等待用户的取消动作)。当有正确的信号返回时,继续往下的操作。

异步方式下,InternetOpenUrl可以在header头里设置要读取的范围。比如读0到1024的数据,在header头里加入Range: bytes=0-1024rn。这种方式保证了断点续传。要注意的是,如果服务器支持断点续传,此时使用HttpQueryInfo得到的状态码是206,而不是200。

1 2  下一页

Tags:WinInet 开发 同步

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接