Hi,
noch eine kleine Verbesserung, um das Debugging in neueren Delphi Versionen zu vereinfachen:
Delphi-Quellcode:
--- D:/Downloads/csWorkerThreadPool.pas Sat Nov 29 15:30:22 2008
+++ D:/csWorkerThreadPool.pas Sun May 17 01:38:13 2009
@@ -113,6 +113,7 @@
fMsg: String;
Procedure DoAction;
{$ENDIF}
+ procedure SetName;
Procedure Run;
Procedure DoOnException;
procedure DoNotify;
@@ -265,6 +266,35 @@
{ TWorkerThread }
+{$IFDEF MSWINDOWS}
+type
+ TThreadNameInfo = record
+ FType: LongWord; // must be 0x1000
+ FName: PAnsiChar; // pointer to name (in user address space)
+ FThreadID: LongWord; // thread ID (-1 indicates caller thread)
+ FFlags: LongWord; // reserved for future use, must be zero
+ end;
+{$ENDIF}
+
+procedure TWorkerThread.SetName;
+{$IFDEF MSWINDOWS}
+var
+ ThreadNameInfo: TThreadNameInfo;
+{$ENDIF}
+begin
+{$IFDEF MSWINDOWS}
+ ThreadNameInfo.FType := $1000;
+ ThreadNameInfo.FName := 'csWorkerThread';
+ ThreadNameInfo.FThreadID := $FFFFFFFF;
+ ThreadNameInfo.FFlags := 0;
+ try
+ RaiseException($406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord),
+ @ThreadNameInfo);
+ except
+ end;
+{$ENDIF}
+end;
+
Constructor TWorkerThread.Create(aID: Integer; aJobList: TWorkerThreadJobList);
Begin
Inherited Create(True);
@@ -302,6 +332,7 @@
Procedure TWorkerThread.Execute;
Begin
+ SetName;
While Not Terminated Do Begin
fCurrentJob := fJobList.WaitForNextJob;
If Assigned(fCurrentJob) Then Begin
Das benennt die Threads dann ordentlich, so daß man diese im Debugger auch erkennt
Ich weiß aus dem Kopf nicht, ob die
Exception für benannte Threads < Delphi 2006 Probleme macht, vielleich packst Du noch ein IFDEF rein, damit es nur > Delphi 2006 verwendet wird.
Gruß Assertor