程序是由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'等错误.应该怎么改啊?我在界面上放的进度条,一定要用到啊,如果不用的话怎么判断下载了多少啊?
现在我想把原来的代码改成多线程的(大致代码如下):
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'等错误.应该怎么改啊?我在界面上放的进度条,一定要用到啊,如果不用的话怎么判断下载了多少啊?
解决方案 »
- 问个在窗体界面中关于权限的问题
- 如何改变dbcombobox的下拉列表框宽度为其中items中的最长字符串长度
- DELPHI 2009 的帮助哪里找到?
- 打开COM10以上的串口会出错?为什么?(附源码)
- how to hook messagebox?
- Rave的問題(要怎樣才能使多頁報表都有表頭)
- 在delphi中怎么打开readme.txt文件?
- 那位大虾有把dbgrid数据转换为Excel文件的代码???
- outlook 求助
- 请问在Delphi中如何查看cpu的信息,如Mem一样?
- 请问如何利用Delphi实现向Web数据库实现POST递交数据,请注意,本地MIS应用,非ISAPI,非CGI。
- 有没有什么控件,既可以在上面用键盘输入文字,而且也可以用鼠标在上面画图?在线等哈!!
...
IdHTTP1:=TIdHTTP.Create(nil);
...这个IdHTTP1是动态创建的,应该要设置好它的事件处理函数IdHTTP1:=TIdHTTP.Create(nil);
IdHTTP1.OnWorkEnd:=IdHTTP1Status;//加上这两句代码
IdHTTP1.OnStatus :=IdHTTP1WorkEnd;//
线程单元主要代码如下:
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; 改成了多线程后,我要把上面关于进度条的代码改一下用起来.应该怎么改?
<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
代码怎么写?参数怎么设?
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.