WEB开发网
开发学院软件开发VC 点对点多线程断点续传的实现 阅读

点对点多线程断点续传的实现

 2010-01-09 20:31:56 来源:WEB开发网   
核心提示:下面介绍开始方法://开始方法int cdownload::startask(int n){//读入文件长度doinfo.filelen=zmfile[n].length;//读入名字fname=zmfile [n].name;CString tmep;//初使化文件名tmep.Format ("\\temp

下面介绍开始方法:

//开始方法
int cdownload::startask(int n)
{
  //读入文件长度
  doinfo.filelen=zmfile[n].length;
  //读入名字
  fname=zmfile [n].name;
  CString tmep;
  //初使化文件名
  tmep.Format ("\\temp\\%s",fname);
  //给主函数发消息
  CString aaa;
   aaa="正在读取 "+fname+" 信息,马上开始下载。。。\n";
   AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
   aaa.ReleaseBuffer();
  //如果文件长度小于0就返回
  if(doinfo.filelen<=0) return -1;
  //建一个以.down结尾的文件记录文件信息
  CString m_temp;
   m_temp=fname+".down";

  doinfo.name=m_temp;
  FILE* fp=NULL;
  CFile myfile;
  //如果是第一次下载文件,初使化各记录文件
   if((fp=fopen(m_temp,"r"))==NULL){
  filerange[0]=0;
  //文件分块
  for(int i=0;i<BLACK;i++)
  {
    if(i>0)
       filerange[i*2]=i*(doinfo.filelen/BLACK+1);
    filerange[i*2+1] =doinfo.filelen/BLACK+1;
  }
  filerange[BLACK*2-1]=doinfo.filelen-filerange [BLACK*2-2];
  myfile.Open(m_temp,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary);
  //写入文件长度
  myfile.Write (&doinfo.filelen,sizeof(int));
  myfile.Close();

  CString temp;
  for(int ii=0;ii<BLACK;ii++){
  //初使化各进程记录文件信息(以.downN结尾)
  temp.Format(".down%d",ii);
  m_temp=fname+temp;
   myfile.Open(m_temp,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary);
  //写入 各进程文件信息
  myfile.Write(&filerange[ii*2],sizeof(int));
   myfile.Write(&filerange[ii*2+1],sizeof(int));
  myfile.Close();
  }
  ((CMainFrame*)::AfxGetMainWnd())->m_work.m_ListCtrl->AddItemtwo (n,2,0,0,0,doinfo.threadno);
  }
  else{
  //如果文件已存在,说明是续 传,读上次信息
  CString temp;

  m_temp=fname+".down0";
  if((fp=fopen(m_temp,"r"))==NULL)
    return 1;
  else fclose (fp);
  int bb;
  bb=0;
  //读各进程记录的信息
  for(int ii=0;ii<BLACK;ii++)
  {
    temp.Format(".down%d",ii);
     m_temp=fname+temp;

    myfile.Open(m_temp,CFile::modeRead | CFile::typeBinary);
    myfile.Read(&filerange[ii*2],sizeof(int));
     myfile.Read(&filerange[ii*2+1],sizeof(int));
    myfile.Close();
     bb = bb+filerange[ii*2+1];
    CString temp;
  }
  if(bb==0) return 1;
  doinfo.totle=doinfo.filelen-bb;

   ((CMainFrame*)::AfxGetMainWnd())->m_work.m_ListCtrl->AddItemtwo (n,2,doinfo.totle,1,0,doinfo.threadno);
  }
   //建立下载结束进程timethread ,以管现各进程结束时间。
  DWORD dwthread;
  ::CreateThread (NULL,0,timethread,(LPVOID)this,0,&dwthread);
  return 0;
}

上一页  1 2 3 4 5 6  下一页

Tags:线程 断点 实现

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