程序是由idhttp来下载东西,原来的程序是用idhttp控件,
现在我想把原来的代码改成多线程的(大致代码如下):
procedure TThreadHttp.Execute;
var
  IdHTTP1 : TIdHttp;
begin
  FreeOnTerminate:=true;
  ......
  IdHTTP1:=TIdHTTP.Create(nil);
  ......
  IdHTTP1.Get(aURL, tStream);
  ......
end;问题是原来程序的如下代码怎么改?(如下):
procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  ProgressBar1.Position:=ProgressBar1.Max;
end;procedure IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: String);
begin
  Memo_Update.Lines.Add(AStatusText);
end;
用原来的以上代码会提示Undeclared identifier:'TWorkMode'等错误.应该怎么改啊?我在界面上放的进度条,一定要用到啊,如果不用的话怎么判断下载了多少啊?

解决方案 »

  1.   

    判断进度条的进度显示在 IdHTTP的 WorkBegin,Work,WorkEnd 3个事件里写代码  注意AWorkCount参数
      

  2.   

    可能是这个原因,在你的线程TThreadHttp.Execute;中,
    ...
    IdHTTP1:=TIdHTTP.Create(nil);
    ...这个IdHTTP1是动态创建的,应该要设置好它的事件处理函数IdHTTP1:=TIdHTTP.Create(nil);
    IdHTTP1.OnWorkEnd:=IdHTTP1Status;//加上这两句代码
    IdHTTP1.OnStatus :=IdHTTP1WorkEnd;//
      

  3.   

    谢谢你们,我把我的代码都贴上来,希望你们帮忙一下!谢谢..
    线程单元主要代码如下:
    constructor TThreadHttp.create(myurl: string);
    begin
      inherited Create(false);
      aURL:=myurl;
    end;procedure TThreadHttp.Execute;
    var
      tStream: TFileStream;
      aFile : string;
      IdHTTP1 : TIdHttp;
    begin
      FreeOnTerminate:=true;
      IdHTTP1:=TIdHTTP.Create(nil);
      aFile:=GetURLFileName(aURL);//得到url最后一个文件名:如:如:http://localhost/aa/bb.exe,得到bb.exe
      if FileExists(aFile) then tStream := TFileStream.Create(aFile, fmOpenWrite)
      else tStream := TFileStream.Create(aFile, fmCreate);
      IdHTTP1.Request.ContentRangeStart := 0;
      try
        IdHTTP1.Get(aURL, tStream);
      except
        MessageBox(handle,PChar('请检查网络!'),'提示',MB_OK+MB_ICONINFORMATION);
        tStream.Free;
        IdHTTP1.Disconnect;
        Exit;
      end;
      tStream.Free;
      IdHTTP1.Disconnect;
    end;主窗体单元主要代码如下:
    procedure TUpdatefrm.sbnstartClick(Sender: TObject);
    var
     XMLDocument :IXMLDocument;
     XMLNode :IXMLNode;
     i,j:integer;
     Node_name:string;
     ThreadDown1: TThreadHttp;
    begin
      XMLDocument:=TXMLDocument.Create('http://aaa/aa/newversion.xml');
      XMLDocument.Active;
      XMLNode := XMLDocument.DocumentElement;
      j := XMLNode.ChildNodes.Count-1;
      for i:=0 to j do
      begin
        XMLNode := XMLDocument.DocumentElement;
        XMLNode:=XMLNode.ChildNodes.Nodes[i];
        if strtoint(XMLNode.Attributes['date'])>strtoint(nowversion_date) then //如果版本时间大于服务端的时间
        begin
          //Memo_Update.Lines.Add('即将下载数据:'+Node_name);
          Node_name:=XMLNode.NodeValue;
          ThreadDown1:=TThreadHttp.Create('http://aaa/aa/Down_Data/'+Node_name);
          //Memo_Update.Lines.Add('已成功下载!'+Node_name);
        end;
      end;
    end;主窗体里有个progressbar,在没有弄成多线程时的代码如下:
    procedure TUpdatefrm.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      ProgressBar1.Position:=ProgressBar1.Max;
    end;procedure TUpdatefrm.IdHTTP1Status(ASender: TObject;const AStatusText: String);
    begin
      Memo_Update.Lines.Add(AStatusText);
      Memo_Update.Lines.Add('正在下载数据,请耐心等待');
    end;procedure TUpdatefrm.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      ProgressBar1.Position:=AWorkCount;
    end;   procedure TUpdatefrm.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      ProgressBar1.Max:=AWorkCountMax;
      ProgressBar1.Min:=0;
      ProgressBar1.Position:=0;
    end;  改成了多线程后,我要把上面关于进度条的代码改一下用起来.应该怎么改?  
      

  4.   

    其中newversion.xml的文件如下:
    <version ver="5.5.5.5">
       <Item1 date="20061205">a.exe</Item1>   
       <Item2 date="20061205">b.xml</Item2> 
       <Item3 date="20061205">c.txt</Item3> 
    </version>
    上面的关于xml的代码我是循环得到a.exe,b.xml,c.txt
      

  5.   

    zouansuifeng和do2008,谢谢你们关注!我是新手按你们说的,不太能上手写不出来,能具体给一下代码吗?如关于IdHTTP.work事件的
    代码怎么写?参数怎么设?
      

  6.   

    http://community.csdn.net/Expert/topic/5220/5220328.xml?temp=.4521295已经回帖
      

  7.   

    好了,我写了一个demo,测试了一下,没有问题1.主窗口单元unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP, StdCtrls,XMLDoc,XMLIntf,Unit2, ComCtrls;type
      TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        Button1: TButton;
        Memo_Update: TMemo;
        ProgressBar1: TProgressBar;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
          const AStatusText: String);
        procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
          const AWorkCount: Integer);
        procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
          const AWorkCountMax: Integer);
        procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
      private
        { Private declarations }
      public
        { Public declarations }
        nowversion_date:string;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
     XMLDocument :IXMLDocument;
     XMLNode :IXMLNode;
     i,j:integer;
     Node_name:string;
     ThreadDown1: TThreadHttp;
    begin
      //http://127.0.0.1:8080/myapp/newversion.xml
      XMLDocument:=TXMLDocument.Create('http://127.0.0.1:8080/myapp/newversion.xml');
      XMLDocument.Active;
      XMLNode := XMLDocument.DocumentElement;
      j := XMLNode.ChildNodes.Count-1;
      for i:=0 to j do
      begin
        XMLNode := XMLDocument.DocumentElement;
        XMLNode:=XMLNode.ChildNodes.Nodes[i];
        if strtoint(XMLNode.Attributes['date'])>strtoint(nowversion_date) then //如果版本时间大于服务端的时间
        begin
          //Memo_Update.Lines.Add('即将下载数据:'+Node_name);
          Node_name:=XMLNode.NodeValue;
          ThreadDown1:=TThreadHttp.Create('http://127.0.0.1:8080/myapp/'+Node_name);
          //Memo_Update.Lines.Add('已成功下载!'+Node_name);
        end;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     nowversion_date :='20061205';
    end;procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
    begin
       Memo_Update.Lines.Add(AStatusText);
       //Memo_Update.Lines.Add('正在下载数据,请耐心等待');end;procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
     ProgressBar1.Position:=AWorkCount;
    end;procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      ProgressBar1.Max:=AWorkCountMax;
      ProgressBar1.Min:=0;
      ProgressBar1.Position:=0;end;procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    begin
      ProgressBar1.Position:=ProgressBar1.Max;  Memo_Update.Lines.Add('正在下载数据结束');
    end;end.2.线程单元
    unit Unit2;interfaceuses
      Classes, IdHTTP,SysUtils,Windows;type
      TThreadHttp = class(TThread)
      private
        { Private declarations }
        aURL: string;
      protected
        procedure Execute; override;
      public
        constructor create(myurl: string);
      end;
    implementationuses Unit1;
    constructor TThreadHttp.create(myurl: string);
    begin
      inherited Create(false);
      aURL := myurl;
    end;
    function GetURLFileName(aURL: string): string;
    var
      i: integer;
      s: string;
    begin //返回下载地址的文件名
      s := aURL;
      i := Pos('/', s);
      while i<>0 do //去掉"/"前面的内容剩下的就是文件名了
      begin
        Delete(s, 1, i);
        i := Pos('/', s);
      end;
      Result := s;
    end;procedure TThreadHttp.Execute;
    var
      tStream: TFileStream;
      aFile: string;
      IdHTTP1: TIdHttp;
    begin
      FreeOnTerminate := true;
      IdHTTP1 := TIdHTTP.Create(nil);
      IdHTTP1.OnStatus:=Form1.IdHTTP1Status;//加上这两句代码
      IdHTTP1.OnWork :=Form1.IdHTTP1Work;//
      IdHTTP1.OnWorkBegin:=Form1.IdHTTP1WorkBegin;//加上这两句代码
      IdHTTP1.OnWorkEnd :=Form1.IdHTTP1WorkEnd;//  aFile := GetURLFileName(aURL); //得到url最后一个文件名:如:如:http://localhost/aa/bb.exe,得到bb.exe
      if FileExists(aFile) then tStream := TFileStream.Create(aFile, fmOpenWrite)
      else tStream := TFileStream.Create(aFile, fmCreate);
      IdHTTP1.Request.ContentRangeStart := 0;
      try
        IdHTTP1.Get(aURL, tStream);
      except
        MessageBox(handle, PChar('请检查网络!'), '提示', MB_OK + MB_ICONINFORMATION);
        tStream.Free;
        IdHTTP1.Disconnect;
        Exit;
      end;
      tStream.Free;
      IdHTTP1.Disconnect;
    end;
    end.