【发布时间】:2012-12-04 23:42:47
【问题描述】:
我的应用程序可以从 memo1 中的每个 url 下载一张图片。 它使用 idhttp.get 并有一个跳过按钮。跳过后下载下一张图片。
Q1:你有代码要放入析构函数吗?“终止”和“等待”的代码是什么? 我在另一个网站上找到了这个:
destructor thread.destroy;
begin
try
Terminate;
If HTTP.Connected then HTTP.Disconnect;
finally
WaitFor;
FreeAndNil(HTTP);
end;
inherited;
end;
Q2:如何调用析构函数并使其工作?
Q3:您有提示(尤其是安全问题)和额外的代码行吗?
我的应用程序代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP;
type
thread = class
public
Constructor Create; overload;
Destructor Destroy; override;
end;
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
startbutton: TButton;
skipbutton: TButton;
procedure startbuttonClick(Sender: TObject);
procedure skipbuttonClick(Sender: TObject);
procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
end;
var
Form1: TForm1;
http: tidhttp;
s: boolean;
implementation
{$R *.dfm}
constructor thread.Create;
begin
HTTP := TIdHTTP.Create(nil);
inherited ;
end;
destructor thread.destroy;
begin
try
If HTTP.Connected then HTTP.Disconnect;
finally
FreeAndNil(HTTP);
end;
inherited;
end;
procedure TForm1.startbuttonClick(Sender: TObject);
var
i: integer;
fs : TFileStream ;
begin
for i:= 0 to memo1.lines.count-1 do begin
s:= false;
fs := TFileStream.Create(inttostr(i)+'abc.jpg', fmCreate);
http:= idhttp1;
try
try
HTTP.Get(memo1.lines[i],fs);
memo2.Lines.add(memo1.Lines[i]);
except
on E: Exception do
begin
memo3.lines.add(' ha ha ha not working '+syserrormessage(getlasterror));
end;
end;
finally
fs.free;
end;
end;
end;
procedure TForm1.skipbuttonClick(Sender: TObject);
begin
s:=true;
end;
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
application.ProcessMessages;
if s = true then
http.Disconnect;
end;
end.
【问题讨论】:
-
为什么你有一个名为
thread的类不是TThread?它是一个通用的TObject后代,除了创建TIdHTTP的global 实例之外基本上什么都不做。您也永远不会将IdHttp1.OnWork事件分配给任何东西,因此永远不会调用TForm1.IdHTTP1Work,因此它不会断开连接。 -
@KenWhite:我怀疑他在表单上放置了一个 IdHttp 并通过设计器实现了该事件。 “线程”类的命名确实令人困惑:)
-
应用程序运行起来就像我在此处粘贴的代码的魅力一样。只是析构函数不起作用。
-
你认为你真的在你的代码中使用线程吗??
-
@whosrdaddy:除了他显然在创建一个与
thread类中的表单上的那个不同的那个。 (表单有IdHTTP1,但在代码中声明并创建了一个http,然后当IdHTTP1在startButtonClick中分配给它时,它就被丢弃了。)这段代码真的是一团糟,我想。
标签: delphi destructor terminate disconnect idhttp