unit Unit2;interfaceusesWindows, Classes;typeTDemoThread = class(TThread)private{ Private declarations }FEvent: THandle;FTimeout: DWORD;protectedprocedure Execute; override;procedure Action; virtual;publicConstructor Create(CreateSuspended: Boolean; aTimeoutInSeconds:Cardinal );Destructor Destroy; override;Procedure WakeAndStop;end;implementation { TDemoThread }procedure TDemoThread.Action;begin// place code to execute after timeout hereend;constructor TDemoThread.Create(CreateSuspended: Boolean;aTimeoutInSeconds: Cardinal);beginFTimeout := aTimeoutInSeconds * 1000; // store as millisecondsFEvent := Windows.CreateEvent( nil, false, false, nil );///在这里可以把FEvent替换成你自己需要的东西// event resets automatically and starts non-signalledinherited Create( CreateSuspended );end;destructor TDemoThread.Destroy;beginTerminate;SetEvent( FEvent );inherited;end;procedure TDemoThread.Execute;Varres: DWORD;beginWhile not Terminated Do Beginres := WaitForSingleObject( Fevent, FTimeout );If res = WAIT_TIMEOUT ThenActionElseBreak;End;end;procedure TDemoThread.WakeAndStop;beginSetEvent( FEvent );end;end.---------------------------------------
用TList,或TStrings来管理, 加载线程的OnTermiated事件procedure TForm1.AddThread(Name: string = ''); var Thread: TMyThread; ThreadName: string; begin if Name = '' then ThreadName := IntToStr(FList.Count + 1); Thread := TMyThread.Create(...); Thread.OnTermated := OnThreadTermiated; FList.AddObject(ThreadName, Thread); end;//Thread 's OnTermiated Event procedure TForm1.OnThreadTermiated(Sender: TObject); var Index: Integer; begin Index := FList.IndexOfObject(Sender); if Index <> -1 then begin //TODO: Add you code ShowMessage('第'+Flist[I]+'死了'); FList.Delete(Index); end; end;
aTimeoutInSeconds:Cardinal );Destructor Destroy; override;Procedure WakeAndStop;end;implementation { TDemoThread }procedure TDemoThread.Action;begin// place code to execute after timeout hereend;constructor TDemoThread.Create(CreateSuspended: Boolean;aTimeoutInSeconds: Cardinal);beginFTimeout := aTimeoutInSeconds * 1000; // store as millisecondsFEvent := Windows.CreateEvent( nil, false, false, nil );///在这里可以把FEvent替换成你自己需要的东西// event resets automatically and starts non-signalledinherited Create( CreateSuspended );end;destructor TDemoThread.Destroy;beginTerminate;SetEvent( FEvent );inherited;end;procedure TDemoThread.Execute;Varres: DWORD;beginWhile not Terminated Do Beginres := WaitForSingleObject( Fevent, FTimeout );If res = WAIT_TIMEOUT ThenActionElseBreak;End;end;procedure TDemoThread.WakeAndStop;beginSetEvent( FEvent );end;end.---------------------------------------
加载线程的OnTermiated事件procedure TForm1.AddThread(Name: string = '');
var
Thread: TMyThread;
ThreadName: string;
begin
if Name = '' then
ThreadName := IntToStr(FList.Count + 1);
Thread := TMyThread.Create(...);
Thread.OnTermated := OnThreadTermiated;
FList.AddObject(ThreadName, Thread);
end;//Thread 's OnTermiated Event
procedure TForm1.OnThreadTermiated(Sender: TObject);
var
Index: Integer;
begin
Index := FList.IndexOfObject(Sender);
if Index <> -1 then
begin
//TODO: Add you code
ShowMessage('第'+Flist[I]+'死了');
FList.Delete(Index);
end;
end;