`
宋科明
  • 浏览: 101877 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多线程下载

阅读更多

unit GetMM;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP;

const
Url='[url]http://www.sergeaura.net/TGP/[/url]'; //下载图片网站地址
OffI=5; //目录个数
OffJ=16; //每个目录下的最大图片数
girlPic='C:\girlPic\'; //保存在本地的路径
maxThread=100;     //最大线程数目
//线程类
type
TGetMM = class(TThread)
private
  procedure decTcount;
  procedure incTcount;
protected
  FMMUrl:string;
  FDestPath:string;
  FSubJ:string;
  procedure Execute;override;
public
  constructor Create(MMUrl,DestPath,SubJ:string);
end;

type
TForm1 = class(TForm)
  Button1: TButton;
  Button2: TButton;
  Memo1: TMemo;
  IdHTTP1: TIdHTTP;
  CheckBox1: TCheckBox;
  Label1: TLabel;
  Edit1: TEdit;
  Edit2: TEdit;
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
private
  { Private declarations }
  RGetMM:TThread;
  procedure GetMMThread(MMUrl,DestPath,SubJ:string);
public
  { Public declarations }
end;

var
Form1: TForm1;
flag:boolean;
tcount:integer; //用来控制当前下载线程用
implementation

{$R *.dfm}

//下载过程
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
SubI,SubJ,CurUrl,DestPath:string;
strm:TMemoryStream;
begin
tcount:=0;
memo1.Lines.Clear;
//建立目录
if not DirectoryExists(girlPic) then
  MkDir(girlPic);
try
  strm :=TMemoryStream.Create;
  for I:=strtoint(edit1.text) to strtoint(edit2.text) do
  begin
    for j:=1 to OffJ do
    begin
    flag:=false;
    if (i<10) then
      SubI:='00'+IntToStr(i)
    else if (i>9) and (i<100) then
      SubI:='0'+inttostr(i)
    else SubI:=inttostr(i);
    if (j>9) then
      SubJ:=inttostr(j)
    else SubJ:='0'+inttostr(j);
    CurUrl:=Url+SubI+'/images/';
    DestPath:=girlPic+SubI+'\';
    if not DirectoryExists(DestPath) then
      ForceDirectories(DestPath);
    //使用线程,速度能提高N倍以上
    if CheckBox1.Checked then
    begin
      while flag=false do
      begin
      if tcount<50 then
        begin
        GetMMThread(CurUrl,DestPath,SubJ);
        flag:=true;
        end;

        label1.Caption:=inttostr(tcount);
        application.ProcessMessages;
      end;
      //sleep(500);

    end else
    //不使用线程
    begin
      try
        strm.Clear;
        IdHTTP1.Get(CurUrl+SubJ+'.jpg',strm);
        strm.SaveToFile(DestPath+SubJ+'.jpg');
        Memo1.Lines.Add(CurUrl+' Download OK !');
        strm.Clear;
        IdHTTP1.Get(CurUrl+'tn_'+SubJ+'.jpg',strm);
        strm.SaveToFile(DestPath+'tn_'+SubJ+'.jpg');
        Memo1.Lines.Add(CurUrl+' Download OK !');
      except
        Memo1.Lines.Add(CurUrl+' Download Error !');
      end;
    end;
    end;
  end;
  Memo1.Lines.Add('All OK!');
finally
  strm.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var x:TMultiReadExclusiveWriteSynchronizer;
begin
Close;
x:=TMultiReadExclusiveWriteSynchronizer.Create;
x.BeginRead;

end;

{ TGetMM }

constructor TGetMM.Create(MMUrl,DestPath,SubJ: string);
begin
FMMUrl :=MMUrl;
FDestPath :=DestPath;
FSubJ :=SubJ;
inherited Create(False);
end;
procedure TGetMM.decTcount;
begin
dec(tcount);
end;
procedure TGetMM.incTcount;
begin
inc(tcount);
end;
procedure TGetMM.Execute;
var
strm:TMemoryStream;
IdGetMM: TIdHTTP;
DestFile:string;
begin
inc(tcount);
//synchronize(incTcount);
try
  //inc(tcount);
  strm :=TMemoryStream.Create;
  IdGetMM :=TIdHTTP.Create(nil);
  try
    DestFile :=FDestPath+FSubJ+'.jpg';
    if Not FileExists(DestFile) then
    begin
    strm.Clear;
    IdGetMM.Get(FMMUrl+FSubJ+'.jpg',strm);
    strm.SaveToFile(DestFile);
    end;
    DestFile :=FDestPath+'tn_'+FSubJ+'.jpg';
    if not FileExists(DestFile) then
    begin
    strm.Clear;
    IdGetMM.Get(FMMUrl+'tn_'+FSubJ+'.jpg',strm);
    strm.SaveToFile(DestFile);
    end;
  except
  end;
finally
  // dec(tcount);
  strm.Free;
  IdGetMM.Free;
end;
dec(tcount);
//synchronize(dectcount);
end;

procedure TForm1.GetMMThread(MMUrl, DestPath, SubJ: string);
begin
RGetMM :=TGetMM.Create(MMUrl,DestPath,SubJ);
end;

end.

分享到:
评论

相关推荐

    C#实现支持断点续传多线程下载客户端工具类

    多线程下载则能显著提高大文件下载的速度,通过将文件分割成多个部分并同时下载来利用多核处理器的优势。 这个C# DIY HttpWebClient工具类基于对System.Net.WebClient的修改和扩展。WebClient是.NET Framework提供...

    易语言多线程下载不卡速度快

    在本项目中,“易语言多线程下载不卡速度快”是一个利用易语言实现的多线程下载工具,旨在提供高效、稳定的文件下载体验。通过多线程技术,该工具能够同时处理多个下载链接,使得下载过程更加流畅,减少因单一线程...

    C# Winform 多线程下载

    在C# Winform应用中实现多线程下载是一项常见的任务,尤其在处理大文件或需要提高下载速度的情况下。本文将详细讲解如何利用C#的多线程技术来创建一个Winform应用程序,实现高效的文件下载功能。 首先,我们需要...

    利用idhttp进行多线程下载

    在Delphi编程环境中,利用 Indy (Internet Direct) 的 `TIdHTTP` 组件进行多线程下载是一项常见的任务,尤其适用于处理大文件,以提高下载效率并提供更好的用户体验。`TIdHTTP` 是Indy库中的一个核心组件,用于执行...

    C#实现多线程下载文件

    本文将深入探讨如何在C#中实现多线程下载文件,涉及的知识点包括线程池、异步编程、进度更新以及错误处理。 首先,我们需要了解线程的基本概念。在C#中,线程是程序执行的独立路径,每个线程都有自己的调用堆栈,...

    多线程下载器.zip易语言项目例子源码下载

    《多线程下载器——易语言项目实例解析》 在当今高速发展的互联网世界中,高效的数据传输成为了一项重要的需求。多线程下载器作为提升下载速度的有效工具,被广泛应用于各种场景。本文将深入剖析一个基于易语言实现...

    C#模仿迅雷的多线程下载类

    ### C#模仿迅雷的多线程下载类:深度解析与应用 在现代软件开发中,网络资源的高效下载已成为一个关键环节。特别是在处理大文件或在网络条件不佳的情况下,单线程下载往往效率低下,用户体验差。为此,多线程下载...

    多线程下载+进度条

    在IT领域,多线程下载和进度条显示是提高用户体验和优化下载效率的重要技术。这里我们将深入探讨这两个概念以及如何实现它们。 首先,多线程下载是指在一个下载任务中使用多个独立的线程同时从服务器获取数据。这种...

    C# httpwebrequest 多线程下载类

    在多线程下载场景中,我们通常会为每个下载任务创建一个独立的线程,以便并发执行多个请求,提高下载效率。 下面,我们将逐步解析实现`C# httpwebrequest 多线程下载类`的关键步骤: 1. **创建下载类**:首先,...

    SpringBoot版本的多线程下载文件,分段下载文件

    本篇将深入探讨如何利用SpringBoot实现多线程下载文件以及分段下载文件的技术。 首先,多线程下载文件是一种提高下载速度的方法,通过将大文件分成多个小部分,每个部分由一个单独的线程负责下载,从而充分利用多核...

    多线程下载工具

    标题中的“多线程下载工具”指的是一个利用多线程技术来提高文件下载速度的应用程序。在计算机编程中,多线程是指在一个程序内同时执行多个独立的线程,每个线程负责不同的任务,比如在下载场景中,一个线程负责处理...

    基于Qt5和libcurl的多线程下载器.zip

    【标题】基于Qt5和libcurl的多线程下载器是一种高效的C++应用程序,它利用了Qt5的图形用户界面(GUI)库和libcurl库的功能来实现文件的多线程下载。Qt5是一个功能丰富的跨平台应用开发框架,支持Windows、Linux、...

    多线程下载原理

    在IT领域,多线程下载是一项重要的技术,尤其在处理大文件或大量数据时,能够显著提高下载效率。本文将详细解析"多线程下载原理",并结合提供的java工程net和android工程videonews来深入理解这一概念。 首先,我们...

    易语言多线程下载源码

    在“易语言多线程下载源码”这个主题中,我们将深入探讨如何使用易语言实现高效的多线程下载功能。 在互联网上下载大文件时,单线程下载往往速度受限,而多线程下载可以显著提高下载效率,因为它允许同时从服务器...

    android断点续传_多线程下载demo

    在Android开发中,断点续传和多线程下载是提高用户下载体验的重要技术。本文将深入探讨如何在Android客户端实现这些功能,并结合服务器端的配合来完成整个流程。 首先,断点续传(Resumable Download)允许用户在...

    python m3u8多线程下载器

    在本项目中,我们关注的是利用Python实现的“m3u8多线程下载器”。M3U8是一种基于HTTP/HTTPS协议的流媒体格式,常用于在线视频播放,尤其在移动设备上。它将视频文件分割成多个小片段,方便流式传输。 这个下载器...

    多线程下载demo

    在IT领域,多线程下载是一种常见的优化网络资源获取的技术,尤其在大文件下载时能够显著提高下载速度。本文将详细解析多线程下载的原理、实现方式以及断点续传的概念。 首先,多线程下载的核心思想是将一个大的文件...

    Java多线程下载器

    Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个部分并同时下载,显著提高了下载速度。在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O...

    (Java)FTP多线程下载源代码

    采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...

Global site tag (gtag.js) - Google Analytics