Мое приложение может загружать одну картинку с каждого URL-адреса в memo1. Он использует idhttp.get и имеет skipbutton. После пропустить он загружает следующую картинку.деструктор при остановке idhttp.get (indy, delphi)
Q1: У вас есть код для ввода в деструктор и что такое код для «terminate» и «waitfor»? Я нашел это на другом сайте:
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'. Вы также никогда не назначаете событие IdHttp1.OnWork' ни на что, поэтому 'TForm1.IdHTTP1Work' никогда не будет вызываться, поэтому он не может отключиться. –
@KenWhite: Я подозреваю, что он сбросил IdHttp на его форму и внедрил это событие через дизайнера. Именование класса «поток» действительно путается: – whosrdaddy
приложение работает как шарм с кодом, который мы вставили здесь. Просто деструктор не работает. –