Einzelnen Beitrag anzeigen

Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#63

Re: Workerthread: Der Diener im Hintergrund

  Alt 17. Mai 2009, 01:42
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
Frederik
  Mit Zitat antworten Zitat