c++多任务多线程,出现了问题

lovemyselfwys 2011-11-29 03:51:16
我想写一个下载的多线程,就是可以:
1,把一个下载任务,比如一个文件,分成3个线程来下载 (完成)
2,同时添加N个下载任务,每个任务下载如1描述。(失败)
结果是所有的任务文件都被分成3个块,然后全都没有下载完成。就是说,我有20个任务,结果出现60个下载未完成的文件。
部分代码如下:
void CtelephoneManageDlg::DownLoadHomeTheme()
{
CWinThread* pthread[50];
PageNum = m_HomepageID.GetCount();
CtelephoneManageDlg *pMainWnd = (CtelephoneManageDlg*)AfxGetMainWnd();
for (int i=0;i<PageNum;i++)
{
tagDownload *dlStr = new tagDownload;
CString m_JpgIconUrl =_T("http://files.35.cc/") + m_HomepageID.GetAt(i) + _T("/ThumbIcon/") +m_HomepagePID.GetAt(i) + _T(".jpg");
dlStr->pWnd = pMainWnd;
dlStr->strUrl = m_JpgIconUrl;
dlStr->strSaveWhere = m_fileIconApp;
pthread[i] = AfxBeginThread(CreateDownLoadThread,dlStr);
}

}

UINT CtelephoneManageDlg::CreateDownLoadThread(LPVOID pParam)
{
tagDownload *pInfo = (tagDownload*)pParam;
//CtelephoneManageDlg *pThis = (CtelephoneManageDlg*)pInfo->pWnd;
fnMyDownload(pInfo->strUrl,pInfo->strSaveWhere,downloaded,totalSize,_T(""),0,3);

return 0;

}

....

UINT CHttpGet::ThreadDownLoad(void* pParam)
{
CHttpSect *pInfo=(CHttpSect*)pParam;
SOCKET hSocket;

if(pInfo->bProxyMode){
hSocket=ConnectHttpProxy(pInfo->szProxyAddr,pInfo->nProxyPort);
}
else{
hSocket=ConnectHttpNonProxy(pInfo->szHostAddr,pInfo->nHostPort);
}
if(hSocket == INVALID_SOCKET) return 1;


// 计算临时文件大小,为了断点续传
DWORD nFileSize=myfile.GetFileSizeByName(pInfo->szDesFilename);
DWORD nSectSize=(pInfo->nEnd)-(pInfo->nStart);

// 此段已下载完毕.
if(nFileSize==nSectSize){
//mj
//printf("文件下载成功!下载结束!\n"); //这里可以设置写信息
//mj

//TRACE("文件已下载完毕!\n");
CHttpGet::m_nCount++; // 计数.
return 0;
}

FILE *fpwrite=myfile.GetFilePointer(pInfo->szDesFilename);
if(!fpwrite) return 1;

// 设置下载范围.
SendHttpHeader(hSocket,pInfo->szHostAddr,pInfo->szHttpAddr,
pInfo->szHttpFilename,pInfo->nStart+nFileSize);

// 设置文件写指针起始位置,断点续传
fseek(fpwrite,nFileSize,SEEK_SET);

DWORD nLen;
DWORD nSumLen=0;
char szBuffer[1024];

while(1)
{
if(nSumLen>=nSectSize-nFileSize) break;
nLen=recv(hSocket,szBuffer,sizeof(szBuffer),0);

//原子操作,不用同步。
rdownloaded += nLen;

if (nLen == SOCKET_ERROR){
//TRACE("Read error!\n");
fclose(fpwrite);
return 1;
}

if(nLen==0) break;
nSumLen +=nLen;
//TRACE("%d\n",nLen);

// 把数据写入文件.
fwrite(szBuffer,nLen,1,fpwrite);
}


fclose(fpwrite); // 关闭写文件.
closesocket(hSocket); // 关闭套接字.
CHttpGet::m_nCount++; // 计数.
return 0;
}



请教高手如何解决。
...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovemyselfwys 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qq120848369 的回复:]

引用 8 楼 lovemyselfwys 的回复:

引用 3 楼 dahuaixiaohuai 的回复:

可以考虑把文件分段,每个线程分别下载一部分数据,
1下0--1024
2下1025-2048
3下2049-4096
然后合写到一起。

这个我已经实现了,但只是局限在一个下载任务。那多个任务呢?


一个任务是一个对象,任务里分成几个子任务,将这些子任务分发出……
[/Quote]

嗯,这个有点道理。虽然我已经实现了上述我自己的想法,不过你这个方法以后试试。
qq120848369 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lovemyselfwys 的回复:]

引用 3 楼 dahuaixiaohuai 的回复:

可以考虑把文件分段,每个线程分别下载一部分数据,
1下0--1024
2下1025-2048
3下2049-4096
然后合写到一起。

这个我已经实现了,但只是局限在一个下载任务。那多个任务呢?
[/Quote]

一个任务是一个对象,任务里分成几个子任务,将这些子任务分发出去让多线程分别下载,最后统一提交到完成队列,由另外一个线程根据子任务所属的任务拼装。

我的思路就是这样,如果你非要用多线程做的话,其实根本没必要多线程。
lovemyselfwys 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 aaseh 的回复:]

我认认真真地看了,结果发现你给的代码说明不了什么问题。
[/Quote]

是的,我也不知道该贴哪些代码。
lovemyselfwys 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dahuaixiaohuai 的回复:]

可以考虑把文件分段,每个线程分别下载一部分数据,
1下0--1024
2下1025-2048
3下2049-4096
然后合写到一起。
[/Quote]
这个我已经实现了,但只是局限在一个下载任务。那多个任务呢?
lovemyselfwys 2011-11-29
  • 打赏
  • 举报
回复
是的,但我写不出来,总会互相影响。
[Quote=引用 2 楼 ouyh12345 的回复:]

各任务是否为独立的?
[/Quote]
qq120848369 2011-11-29
  • 打赏
  • 举报
回复
另一端支持你这样做?
lovemyselfwys 2011-11-29
  • 打赏
  • 举报
回复
如果最后没办法的话,就不分三个线程来下了。主要是为了后面做断点续传准备的。
[Quote=引用 1 楼 healer_kx 的回复:]

一个文件别分成三个线程来下载了,而且多线程下载也是要server支持才行。
[/Quote]
aaseh 2011-11-29
  • 打赏
  • 举报
回复
我认认真真地看了,结果发现你给的代码说明不了什么问题。
一叶之舟 2011-11-29
  • 打赏
  • 举报
回复
可以考虑把文件分段,每个线程分别下载一部分数据,
1下0--1024
2下1025-2048
3下2049-4096
然后合写到一起。
ouyh12345 2011-11-29
  • 打赏
  • 举报
回复
各任务是否为独立的?
healer_kx 2011-11-29
  • 打赏
  • 举报
回复
一个文件别分成三个线程来下载了,而且多线程下载也是要server支持才行。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧