2015-04-19 3 views
1

Сначала HI ALL и sry для моего английского. может ли кто-нибудь поделиться источником работы с create + destroy threads с простым GET в исполнении?Delphi XE + thread + idHttp без утечек памяти

я попробовать сделать это сам, но всегда получает утечку памяти ((

я проверить его с кодом на конце источника

initialization 
    ReportMemoryLeaksOnShutdown := True; 

кстати плохо Google это 2 недели и испытать много образцов ... и всегда есть утечки по умолчанию = (

Дельфи XE7 32bit на окнах 7 x64

, когда я нажимаю кнопку остановки я все еще вижу некоторые соединения

screenshot

после закрытия я получаю это сообщение

screenshot

косяк сообщению изображение, необходимо 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. 
+0

Было бы хорошо, если бы вы показали нам свой код, чтобы мы могли увидеть, где могут возникнуть эти утечки памяти. – SilverWarior

+0

Не нужно вызывать 'EndThread' в методе' Execute'. Не вызывайте 'terminate' и' waitfor' внутри деструктора destroy. В 'TThread.Create' вызывать' inherited Create (false) 'и не называть' Resume' в конце. –

+0

THX для ответа! сейчас я получаю только эту утечку http://s21.postimg.org/9c9ts58pz/screenshot_911.png – AHTOLLlKA

ответ

3
  • Внутри конструктора нити, вызовите inherited Create(false);. И пропустите звонок Resume в конце. Нить не начнется, пока конструктор не закончит в любом случае.
  • В методе Execute пропустите вызовы EndThread, так как поток будет обрабатывать это, когда заканчивается метод Execute.
  • В деструкторе Destroy не звоните Terminate и Waitfor. Они вообще не принадлежат. Поток сообщается FreeOnTerminate и сделает это изящно.
+0

спасибо !!! не могу голосовать за ответ прямо сейчас sry = ( – AHTOLLlKA

Смежные вопросы