Wyciek pamięci w aplikacji wielowątkowej

0

Czy możecie mi pomóc z threads w Lazarus
chce uruchomić procedure1 i procedure2, następnie w procedurze1 odczekać 5s a w procedurze2 odczekać 10s

Program który napisałem działa ale mam wyciek pamięci

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
  watek1 = class(TThread)
  protected
    procedure Execute; override;
    procedure Status1;
    procedure Status2;
  end;


  watek2 = class(TThread)
  protected
    procedure Execute; override;
    procedure Status3;
    procedure Status4;
  end;



  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  private
    MyThread1: watek1;
    MyThread2: watek2;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
procedure watek1.Status1;
begin
  form1.Memo1.Lines.Add('start procedure 1   ');
end;

procedure watek1.Status2;
begin
  form1.Memo1.Lines.Add('stop procedure 1   ');
end;

procedure watek2.Status3;
begin
  form1.Memo1.Lines.Add('start procedure 2 ');
end;

procedure watek2.Status4;
begin
  form1.Memo1.Lines.Add('stop procedure 2  ');
end;

procedure watek1.Execute;
begin
  Synchronize(@Status1);
  sleep(5000);
  Synchronize(@Status2);
end;

procedure watek2.Execute;
begin
  Synchronize(@Status3);
  sleep(10000);
  Synchronize(@Status4);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  inherited;
  MyThread1 := watek1.Create(True);
  MyThread2 := watek2.Create(True);

  MyThread1.Start;
  MyThread2.Start;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin

  MyThread1.Terminate;
  MyThread2.Terminate;
  inherited;
end;

end.
5
  MyThread1 := watek1.Create(True);
  MyThread2 := watek2.Create(True);
  MyThread1.FreeOnTerminate:= True; // to dodaj wątek zostanie zwolniony gdy sie zakończy i nie edzie wycieku pamieci
  MyThread2.FreeOnTerminate:= True;
  MyThread1.Start;
  MyThread2.Start;
0

Dzięki działa!

FormClose nie jest już potrzebne

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin

 // MyThread1.Terminate;
 // MyThread2.Terminate;
 // inherited;
end;
4

możesz też zrobić:

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  MyThread1.Free;
  MyThread2.Free;
end;

należy pamiętać, że Thread.Terminate nie robi nic poza ustawieniem flagi Terminated na True, więc jeżeli nie sprawdzasz stanu tej flagi w swoim wątku to nie ma sensu w ogóle wywoływać Thread.Terminate.

1 użytkowników online, w tym zalogowanych: 0, gości: 1