Сначала HI ALL и sry для моего английского. может ли кто-нибудь поделиться источником работы с create + destroy threads с простым GET в исполнении?Delphi XE + thread + idHttp без утечек памяти
я попробовать сделать это сам, но всегда получает утечку памяти ((
я проверить его с кодом на конце источника
initialization
ReportMemoryLeaksOnShutdown := True;
кстати плохо Google это 2 недели и испытать много образцов ... и всегда есть утечки по умолчанию = (
Дельфи XE7 32bit на окнах 7 x64
, когда я нажимаю кнопку остановки я все еще вижу некоторые соединения
после закрытия я получаю это сообщение
косяк сообщению изображение, необходимо 10 репутации ...
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton, sMemo, sEdit,
sSpinEdit, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,System.SyncObjs;
type
TForm1 = class(TForm)
StartBtn: TsButton;
StopBtn: TsButton;
ThreadCount: TsSpinEdit;
sdt1: TsEdit;
sm1: TsMemo;
procedure StartBtnClick(Sender: TObject);
procedure StopBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Thread = class(TThread)
private
HTTP : TIdHTTP;
result:integer;
InputIndex:integer;
public
procedure Local;
constructor Create(CreateSuspended:boolean);
destructor Destroy; override;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
LocalWork: Boolean;
target: string;
implementation
{$R *.dfm}
constructor Thread.Create(CreateSuspended: boolean);
begin
Inherited Create(true);
FreeOnTerminate:=true;
HTTP:=TIdHTTP.Create(nil);
HTTP.ReadTimeout := 2000;
Resume;
end;
destructor Thread.Destroy;
begin
try
If HTTP.Connected then
begin
HTTP.Disconnect(false);
HTTP.IOHandler.InputBuffer.Clear();
HTTP.IOHandler.Close;
Terminate;
end;
finally
WaitFor;
FreeAndNil(HTTP);
end;
inherited;
end;
procedure Thread.Execute;
begin
while (LocalWork=True) do
begin
if LocalWork=true then
begin
HTTP.Get(target);
if HTTP.ResponseCode=200 then
begin
result:=1;
end
else
begin
result:=2;
end;
Synchronize(Local);
end
else
begin
EndThread(0);
end;
end;
EndThread(0);
end;
procedure Thread.Local;
begin
if result=1 then Form1.sm1.Lines.Add('Good ');
if result=2 then Form1.sm1.Lines.Add('Bad ');
end;
procedure TForm1.StartBtnClick(Sender: TObject);
var
i:integer;
begin
target := sdt1.Text;
LocalWork := True;
for I := 0 to ThreadCount.Value-1 do
begin
sm1.Lines.Add('Thread createrd '+inttostr(i));
Thread.Create(true); // создаем замароженный поток
end;
end;
procedure TForm1.StopBtnClick(Sender: TObject);
begin
LocalWork:=false;
end;
initialization
ReportMemoryLeaksOnShutdown := True;
end.
Было бы хорошо, если бы вы показали нам свой код, чтобы мы могли увидеть, где могут возникнуть эти утечки памяти. – SilverWarior
Не нужно вызывать 'EndThread' в методе' Execute'. Не вызывайте 'terminate' и' waitfor' внутри деструктора destroy. В 'TThread.Create' вызывать' inherited Create (false) 'и не называть' Resume' в конце. –
THX для ответа! сейчас я получаю только эту утечку http://s21.postimg.org/9c9ts58pz/screenshot_911.png – AHTOLLlKA