![]() |
Re: Workerthread: Der Diener im Hintergrund
Hi Assertor,
Ich bau das mal ein und stelle es im 1.Post wieder rein. Edit: Achso, äh.. :oops: Danke für das Kompliment. |
Re: Workerthread: Der Diener im Hintergrund
Hi Alzaimar,
Zitat:
:dp: |
Re: Workerthread: Der Diener im Hintergrund
Hi,
noch eine kleine Verbesserung, um das Debugging in neueren Delphi Versionen zu vereinfachen:
Delphi-Quellcode:
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.
--- 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 Gruß Assertor |
Re: Workerthread: Der Diener im Hintergrund
:gruebel: Davon von den @@ Tags habe ich noch nie etwas gehört. Kannst Du mir kurz erklären, worum es dabei geht?
|
Re: Workerthread: Der Diener im Hintergrund
Das ist nur eine Darstellungsform von Unterschieden zwischen zwei Versionen.
Zitat:
--win32 |
Re: Workerthread: Der Diener im Hintergrund
Aha. Ich habe das mal eingebaut und geprüft. Delphi 6 meckert bei der Ausführung mit einer 'external Exception', läuft ansonsten durch. Ich habe das dann aber nur für Delphi 2006 und höher aktiviert.
Zur Ermittlung der Delphi-Version habe ich 'JEDI-SDL.INC' verwendet. Wenn es eine andere/bessere Möglichkeit gibt, die Delphi-Version zu ermitteln, immer her damit. Update wie immer im 1.Post. |
Re: Workerthread: Der Diener im Hintergrund
Hi,
@Win32.API: Danke, warst schneller mit dem Erklären ;) Zitat:
![]() Dann einfach im Source um alle Änderungen ein
Delphi-Quellcode:
Das mit der Änderungsdatei war gestern einfacher, um die geänderten Stellen zu finden - war etwas faul ;) Tools wie
{$IFDEF COMPILER_6_UP}...{$ENDIF}
![]() ![]() Gruß Assertor |
Re: Workerthread: Der Diener im Hintergrund
Gut, diese JEDI-SDL.Inc macht im Prinzip das Gleiche...
|
Re: Workerthread: Der Diener im Hintergrund
Hi,
Zitat:
Außerdem nimmt die JEDI-SDL.inc soweit ich sehen kann auch noch andere Änderungen an den Compiler Einstellungen vor (z.B. {$F+,Q-,R-,S-,I-,A+}). Das braucht der Diener im Hintegrund nicht und führt u.U. - wenn projektweit - zu Probleme oder ungewünschten Einstellungen. Bei der Compilers.inc werden wirklich nur die Compiler festgestellt, kein Rumdrehen an Einstellungen. Gruß Assertor |
Re: Workerthread: Der Diener im Hintergrund
@alzaimar:
Erst mal vielen Dank für deine Mühe, die du in diese Unit gesteckt hast. Ich bin gerade dabei, in einem von meinen kleinen "Projekten" davon zu profitieren.... ;-) Ein paar Fragen/Anmerkungen hätte ich aber doch: - Was bezweckst du mit der Methode TWorkerThreadPool.Notify? - Wie würdest du es anstellen, auf die Abarbeitung aller Jobs in der List zu warten, um z.B. irgendwelche Controls zu aktualisieren oder eine Statusmeldung auszugeben? (Polling auf TWorkerThreadPool.PendingJobCount = 0 ist ja wohl nicht der beste Weg...) - In diesem Thread war mal eine Anmerkung: Zitat:
Zitat:
Delphi-Quellcode:
Läuft der synchronisierte Thread nun autark oder nicht?
If fCurrentJob.Synchronized Then
Synchronize(Run) Else Run; (na ja, vielleicht habe ich deine Source auch noch nicht ganz verstanden...) .sundance. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz