Nie wiem czy jest inne rozwiązanie i prostsze - pewnie tak, ale ja wpadłem na coś takiego jak poniżej. Sprawdziłem i działa,
ale nie wiem czy o takie coś Tobie chodziło. Poniżej kod jakby link, ktory jest od czasu ostatniego pobrania aktywny siedem
dni - wygasł, a ktoś by miał podobny problem i trafił na ten - nomen omen - wątek :) A całe źródło jest pod tym adresem:
http://www.speedyshare.com/files/22798861/threads_4.rar
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls;
type
TMainForm = class(TForm)
LogMemo : TMemo;
ThrStartBtn : TButton;
procedure FormCloseQuery(Sender : TObject; var CanClose : Boolean);
procedure FormCreate(Sender : TObject);
procedure ThrStartBtnClick(Sender : TObject);
private
public
ThrList : TList;
ActiveThr : TThread;
procedure ThrTerminate(Sender : TObject);
end;
TThr = class(TThread)
private
FSleepTime : Cardinal;
protected
procedure Execute; override;
public
constructor Create(SleepTime : Cardinal);
end;
var
MainForm : TMainForm;
implementation
{$R *.dfm}
procedure TThr.Execute;
begin
with MainForm do
begin
Self.OnTerminate := ThrTerminate;
Sleep(FSleepTime);
end;
end;
constructor TThr.Create(SleepTime : Cardinal);
begin
inherited Create(False);
FSleepTime := SleepTime;
end;
procedure TMainForm.ThrTerminate(Sender : TObject);
var
Idx : integer;
begin
Idx := ThrList.IndexOf(Sender);
ThrList.Delete(Idx);
LogMemo.Lines.Delete(Idx);
if ThrList.Count = 0 then
begin
MessageBox(Application.Handle, PChar('Wszystkie wątki zostały zakończone.'),
PChar(Application.Title), MB_OK + MB_ICONINFORMATION);
ThrStartBtn.Enabled := True;
end;
end;
procedure TMainForm.FormCloseQuery(Sender : TObject; var CanClose : Boolean);
begin
ThrList.Free;
end;
procedure TMainForm.FormCreate(Sender : TObject);
begin
Randomize;
LogMemo.Clear;
ThrList := TList.Create;
LogMemo.ReadOnly := True;
Application.Title := Caption;
LogMemo.ScrollBars := ssVertical;
end;
procedure TMainForm.ThrStartBtnClick(Sender : TObject);
var
I : integer;
R : Cardinal;
begin
ThrStartBtn.Enabled := False;
for I := 1 to 20 do
begin
R := Random(10000) + 1000;
LogMemo.Lines.Add(Format('Wątek numer: %.2d - będzie istniał przez: ' +
'%d milisekund(y)', [LogMemo.Lines.Count + 1, R]));
ActiveThr := TThr.Create(R);
ThrList.Add(ActiveThr);
end;
end;
end.