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分内的帖子,很抱歉,大家帮忙一下,给点力,今天折腾了一天了!!!!
我在一个线程中去调用 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分内的帖子,很抱歉,大家帮忙一下,给点力,今天折腾了一天了!!!!
* 多线程运行时被窗口线程打断很正常,哪个线程都会有时间片,CPU调度会保证每个线程都有执行机会。
* 如果需要异步下载效果,就应该在应用层做一些异步支持,比如通过状态来判断下载是否完成,在下载时干别的事情,然后通过回调来修改下载状态。
不过,由于保存到Cache,所以下次访问的时候,速度会比较快。
但,由于是缓存,说不定你下载了很多下来后,要进行下一步操作,有可能会出现部分文件不存在的问题。