请选择 进入手机版 | 继续访问电脑版

大富翁Delphi开发技术网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4830|回复: 7

[已解决] 使用Delphi7开发的多线程下载工具,包括源代码

  [复制链接]

970

主题

1459

帖子

4501

积分

论坛元老

Rank: 8Rank: 8

积分
4501
发表于 2014-2-24 14:50:13 | 显示全部楼层 |阅读模式
开发交流
支持版本:  
资源分类:  

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 曾经拥有 于 2014-4-23 13:22 编辑

XSDownLoad.rar (1.4 MB, 下载次数: 1592)
转载请保留当前帖子的链接:http://www.dfwlt.com/forum.php?mod=viewthread&tid=31 谢谢!

搜索简单,分享不易,且分享且珍惜,您难道不想分享下您的心得?如果觉得本文章好的话,您可以在我们网站上注册,然后发布您的好的心得,让大家共同进步,谢谢!

最新添加

回复

使用道具 举报

970

主题

1459

帖子

4501

积分

论坛元老

Rank: 8Rank: 8

积分
4501
 楼主| 发表于 2014-2-24 14:53:28 | 显示全部楼层
界面截图: 无标题.png
回复 支持 反对

使用道具 举报

970

主题

1459

帖子

4501

积分

论坛元老

Rank: 8Rank: 8

积分
4501
 楼主| 发表于 2014-2-24 14:57:15 | 显示全部楼层
代码1:创建下载进程
procedure CreateDownLoadThread(URL:String
                              ;SavePath:String
                              ;DownLoadThread:Integer
                              ;FileID:String
                              ;FileType:String);
var
  ThreadIndex:Integer;

  function GetFileID:String;
  begin
    Result:=FormatDateTime('DDHHMMSS',Now);
  end;

begin
  ThreadIndex:=GetThreadIndex;
  if ThreadIndex=-1 then
  begin
    MessageBox(Application.Handle,'任务已满,请梢侯在下载','注意!',MB_OK);
    Exit;
  end;

  _ShowSystemInfo('------------------------------------------------------------------------------');
  _ShowSystemInfo('创建第'+IntToStr(ThreadIndex+1)+'个任务线程');
  Download[ThreadIndex]:=TIEDownload.Create(True);
  Download[ThreadIndex].FileUrl:=URL;
  DownLoad[ThreadIndex].FilePath:=SavePath;
  DownLoad[ThreadIndex].ThreadCount:=DownLoadThread;
  Download[ThreadIndex].ThreadIndex:=ThreadIndex;

  if FIleID='' then
    Download[ThreadIndex].FileID:=StrToInt(GetFileID)
  else
    Download[ThreadIndex].FileID:=StrToInt(FileID);

  Download[ThreadIndex].FileType:=FileType;
  Download[ThreadIndex].Resume;
end;


回复 支持 反对

使用道具 举报

970

主题

1459

帖子

4501

积分

论坛元老

Rank: 8Rank: 8

积分
4501
 楼主| 发表于 2014-2-24 14:58:35 | 显示全部楼层
代码2:具体下载代码  try
    InitializeCriticalSectionA;

    URL:=FileUrl;

    {得到文件真实的URL-如果有?那么就要请求得到真实的连接}
    _ShowSystemInfo('开始解析连接....');

    {添加初始信息到列表里}
    AddFileToListView;

    TrueUrlStr:=GetTrueUrl(URL);
    if TrueUrlStr='' then
    begin
      _ShowSystemInfo('没有解析出文件,停止下载,退出线程');
      _ShowFileOtherInfo(FileID,1,'不能下载');
      Exit;
    end;
    _ShowSystemInfo('文件地址:'+TrueUrlStr);

    {文件名称}
    FileName:=GetFileName(TrueUrlStr);
    _ShowSystemInfo('文件名称:'+FileName);
    _ShowFileOtherInfo(FileID,0,FIleName);

    {主机地址}
    UrlFile:=GetUrlFile(TrueUrlStr);
    UrlHost:=GetUrlHost(TrueUrlStr);
    _ShowSystemInfo('主机地址:'+UrlHost);

    {文件长度}
    FIleInfo:=GetFileInfo(UrlFile,UrlHost);
    _ShowSystemInfo('文件长度:'+IntToStr(FIleInfo.TotalLength));
    _ShowFileOtherInfo(FileID,3,IntToStr(Round(FIleInfo.TotalLength/1000)));

    if FileInfo.ISCanRec then
    begin
      _ShowSystemInfo('文件允许下载:'+FileName);
      _ShowSystemInfo('下载范围:'+FIleInfo.RecRang);
    end else
    begin
      _ShowSystemInfo('文件不允许下载:'+FileName);
      _ShowFileOtherInfo(FileID,1,'不能下载');
      Exit;   
    end;

    {创建临时文件}
    _CreateTempFile;
    {创建下载线程}
    _CreateDownLoadThread;

    {保存信息到正在下载历史文件里}
    SaveFileToDownLoadIngFile;

    {监控过程}
    AllHaveDownLoadLength:=0;
    BeginTime:=CPUTimeCounterQPC;
    while not Self.Terminated do
    begin
      Complete:=True;
      CurrentLength:=0;

      {判断文件是否已经完成。。。。}
      for I:=0 to NeedThreadCount-1 do
      begin
        Complete:=Complete and  DownloadThread[I].FComplete;
        CurrentLength:=CurrentLength+(DownloadThread[I].FFilePosEnd-DownloadThread[I].FFilePosBegin);
        //AllHaveDownLoadLength:=AllHaveDownLoadLength+DownloadThread[I].HaveDownLoadLength;
      end;

      EndTime:=CPUTimeCounterQPC;

      _ShowFileProcess(FileID,FIleInfo.TotalLength,FIleInfo.TotalLength-CurrentLength);
      //_ShowDownSpeed(FileID,Round(AllHaveDownLoadLength*1000/(EndTime-BeginTime)));

      if Complete then
      begin
        _ShowFileOtherInfo(FileID,1,'下载完成');
        Sleep(1000);

        {关闭文件}
        if Assigned(FFileStream) then
          FreeAndNil(FFileStream);
        if Assigned(FIniFile) then
          FreeAndNil(FIniFile);

        try
          {删除配置文件}
          DeleteFile(TempConfigFileName);
          {修改文件名}
          if FIleExists(FilePath+'\'+FileName) then
            RenameFile(TempFileName,FilePath
              +'\'
              +Copy(FileName,1,pos('.',FIleName)-1)
              +FormatDatetime('HHMMSS',Now)
              +ExtractFileExt(FIleName)
              )
          else
            RenameFile(TempFileName,FilePath+'\'+FileName);

          {删除正在下载的信息,添加文件信息到已经下载完成的历史文件里}  
          DeleteDownLoadInfFile(FileID);
          SaveFileToDownLoadFile;
          {下载完毕,从Listview的正在下载里面,删除信息}
          DeleteDownLoadFileOnListView;
        except
        end;
        {退出线程}
        Break;
      end;
    end;
  except
  end;

回复 支持 反对

使用道具 举报

0

主题

2

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2014-4-10 11:43:18 | 显示全部楼层
UShellNotifyIcon  CPUCounter_Hss 等等单元没找到
回复 支持 反对

使用道具 举报

322

主题

404

帖子

1350

积分

金牌会员

Rank: 6Rank: 6

积分
1350
发表于 2014-4-10 21:22:04 | 显示全部楼层
Public.rar (14.66 KB, 下载次数: 133)
回复 支持 反对

使用道具 举报

0

主题

1

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2016-1-24 21:38:30 | 显示全部楼层
多谢分享~~~要是支持更多协议就好了~~~
回复 支持 反对

使用道具 举报

0

主题

1

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2018-6-16 17:42:54 | 显示全部楼层
可以编译,,但一运行就出错.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

申请友链|Archiver|手机版|小黑屋|大富翁Delphi开发技术网站 ( 苏ICP备12065705号-4

GMT+8, 2018-10-19 09:37 , Processed in 0.134157 second(s), 32 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表