c++多任务多线程,出现了问题
我想写一个下载的多线程,就是可以:
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;
}
请教高手如何解决。