urldownloadtocachefile 去下载URL图片,每张图片大概几百KB, 但是效率很低,平均需要3秒才下载一张!
我在一个线程中去调用 urldownloadtocachefile !而且在执行调用
URLDownloadToCacheFile(NULL, pImgUrl, szFileName, MAX_PATH, 0, NULL)时,会被窗口线程抢占!加了回调函数后,跟踪发现OnProgress()中状态码依次为:
BINDSTATUS_COOKIE_SENT
BINDSTATUS_CONNECTING
BINDSTATUS_SENDINGREQUEST<<<<<<<<<<<<<被窗口抢占BINDSTATUS_MIMETYPEAVAILABLE
BINDSTATUS_BEGINDOWNLOADDATA
BINDSTATUS_CACHEFILENAMEAVAILABLE
BINDSTATUS_ENDDOWNLOADDATA其中在BINDSTATUS_SENDINGREQUEST之后会被窗口抢占,然后再是BINDSTATUS_MIMETYPEAVAILABLE状态!有知道为什么吗,还有你们的效率高(下载速度)吗??未加回调函数的代码片段如下:
 
  // 打开文件
    DWORD cbInfo = 0;
    GetUrlCacheEntryInfo(pImgUrl, NULL, &cbInfo);
    // 若已经缓存,则直接添加
    if (0 != cbInfo)
    {
        LPINTERNET_CACHE_ENTRY_INFO pInfo = (LPINTERNET_CACHE_ENTRY_INFO)new char[cbInfo];
        if (GetUrlCacheEntryInfo(pImgUrl, pInfo, &cbInfo))
        {
            wcscpy_s(pImgPath, MAX_PATH, pInfo->lpszLocalFileName);
        }
        delete []pInfo;
    }
    // 若未缓存,则下载数据后添加
    else
    {
        WCHAR szFileName[MAX_PATH];
        CBSCallbackImpl bsc;
        if (SUCCEEDED(URLDownloadToCacheFile(NULL, pImgUrl, szFileName, MAX_PATH, 0, &bsc)))
        {
            wcscpy_s(pImgPath, MAX_PATH, szFileName);
        }
    }只允许发表50分内的帖子,很抱歉,大家帮忙一下,给点力,今天折腾了一天了!!!!

解决方案 »

  1.   

    反正你已经有了URL了,可以用URLDownloadToFile来下载文件
      

  2.   

    有URL了,还可以直接走WInet等API来下载文件
      

  3.   

    直接CInternetSession::OpenURL();返回CHttpFile,然后读写数据就行了
      

  4.   

    这么大的文件,花个几秒钟是很正常的。* 这些API内部已经使用了线程在下载,无需自己创建线程。而且即使是多线程,也并不能加快下载速度。
    * 多线程运行时被窗口线程打断很正常,哪个线程都会有时间片,CPU调度会保证每个线程都有执行机会。
    * 如果需要异步下载效果,就应该在应用层做一些异步支持,比如通过状态来判断下载是否完成,在下载时干别的事情,然后通过回调来修改下载状态。
      

  5.   

    网络问题。服务器反馈和传输速度慢。
    不过,由于保存到Cache,所以下次访问的时候,速度会比较快。
    但,由于是缓存,说不定你下载了很多下来后,要进行下一步操作,有可能会出现部分文件不存在的问题。
      

  6.   

    URLDownloadToFile 跟 urldownloadtocachefile 除了下载到路径不同还有其他区别吗?