![]() |
Re: Workerthread: Der Diener im Hintergrund
|
Re: Workerthread: Der Diener im Hintergrund
Ich habe bei mir die Demo aus dem ersten Post kompiliert und gestartet (Delphi 5, Windows XP). Es läuft (ich musste lediglich die Unit Variants entfernen)
Doch leider tut sich irgendwie nichts. In der Memo steht lediglich "500 Jobs generiert". Aber die Abarbeitung der Jobs startet nicht automatisch? P.S. Hab es gerade auf einem anderen PC mit Delphi6 ausprobiert. Dort geht es. Aber warum geht es mit Delphi5 nicht? |
Re: Workerthread: Der Diener im Hintergrund
Ist der/ sind die Threads vielleicht suspendiert?
Stichwort "Resume" |
Re: Workerthread: Der Diener im Hintergrund
Bei D5 weiss ich es nicht, aber D6 hatte bis zu, 2.Update eine Macke im Synchronize.
Wieso friemelst du noch mit D5? :gruebel: |
Re: Workerthread: Der Diener im Hintergrund
Ich bin leider noch an Delphi 5 gebunden, weil wir ein altes und großes Projekt damit pflegen müssen.
Blöderweise brauche ich die Funktionalität in Delphi 5 :? |
Re: Workerthread: Der Diener im Hintergrund
Moin moin,
Zitat:
![]() Meine Vermutung ist, dass die Sourcen im ersten Post nicht die aktuellste Version ist. Zum einen wird dort das setzen der OnJobException ignoriert/nicht berücksichtigt - zum anderen wird dort nur "500 Jobs generiert" ausgegeben, weil die Jobs eine Exception werfen: Abstakter Fehler... (Bekommst du raus, wenn du den Quelltext so änderst, dass OnJobException auch zugewiesen wird) Ich weiss(!), dass es auch mit D5 funktioniert hat, hatte halt damals den Thread verfolgt... Konnte nur leider keine Sourcen mehr davon finden :-/ |
Re: Workerthread: Der Diener im Hintergrund
an diser Stelle war ich auch gerade. Ich habe den Setter für fOnException in der Unit eingebaut und DebugUnit definiert.
Folgendes kommt also raus (bei 5 Threads): meInfo 500 jobs generiert Job received Job received Job received Job received Job received Abstrakter Fehler Abstrakter Fehler Abstrakter Fehler Abstrakter Fehler Abstrakter Fehler Die Exception kommt bei dieser Funktion. Beim Execute.
Delphi-Quellcode:
Procedure TWorkerThread.Run;
// Kleine Hilfsprozedur, die den aktuellen Job ausführt. // Im Falle einer Exception wird (falls angegeben) ein Event aufgerufen. Begin Try If fCurrentJob.UsesCOMObjects And Not fCOMInitialized Then Begin fCOMInitialized := True; CoInitialize(Nil); End; fCurrentJob.execute(Self); Except On E: Exception Do Begin fCurrentException := E; If Assigned(fOnJobException) Then Synchronize(DoOnException); End; End; fCurrentJob.Free; End; P.S. Ich habs :-) Weil die Methode als virtual; abstract deklariert war, konnte sie nicht von der selben Klasse aufgerufen werden, in der sie deklariert war. Daher der abstrakte Fehler. Ich habe jetzt die Funktion als virtual deklariert und einen leeren Funktionsrumpf angelegt. Jetzt gehts.
Delphi-Quellcode:
Procedure Execute(aThread: TWorkerThread); virtual;
Delphi-Quellcode:
Procedure TWorkerThreadJob.Execute;
Begin End; |
Re: Workerthread: Der Diener im Hintergrund
Moin moin,
denke mal der "Fehler" ist nicht die deklaration der Execute Methode als virtual; abstrakt;, denn diese soll ja in einer abgeleiteten Klasse überschrieben werden. Denke mal der Aufruf aus der TSampleJob.Execute in der wpMain mit inherited ist der Fehler. Nimmst du das raus, so läuft es auch. |
Re: Workerthread: Der Diener im Hintergrund
Gut..es läuft :)
Wie finde ich am besten raus, wie viele Threads im Pool "gerade" beschäftigt sind? |
Re: Workerthread: Der Diener im Hintergrund
Hi alzaimar,
ein sehr schöne Kapselung für WorkerThreads. Tolle Arbeit! Das einzige, was ich vermisse, ist eine Eigenschaft aThread.Terminated innerhalb der Jobs. Gerade wenn man länger dauernde Jobs laufen läßt, könnte man hiermit Verzögerungen beim Beenden vermeiden. Edit: Das wär auch sehr einfach zu lösen, da der TWorkerThread ja ein Nachkomme von TThread ist. Einfach das property einfügen und gut ist.
Delphi-Quellcode:
Gruß Assertor
TWorkerThread = Class(TThread)
private fCurrentException: Exception; fCOMInitialized: Boolean; fCurrentJob: TWorkerThreadJob; fOnJobException: TJobExceptionEvent; fJobList: TWorkerThreadJobList; fID: Integer; fOnJobNotify: TJobMessageEvent; fJob: TWorkerThreadJob; fMessage: string; {$IFDEF DebugUnit} fOnAction: TMessageEvent; fMsg: String; Procedure DoAction; {$ENDIF} Procedure Run; Procedure DoOnException; procedure DoNotify; protected Procedure Execute; override; public Constructor Create(aID: Integer; aJobList: TWorkerThreadJobList); Destructor Destroy; override; Procedure Notify (aJob : TWorkerThreadJob; Const aMessage : String); Procedure Synchronize(Method: TThreadMethod); Property ID: Integer read fID; Property OnJobNotify : TJobMessageEvent read fOnJobNotify Write fOnJobNotify; {$IFDEF DebugUnit} Property OnAction: TMessageEvent read fOnAction write fOnAction; {$ENDIF} Property OnJobException: TJobExceptionEvent read fOnJobException write fOnJobException; Property Terminated; // eingefügt End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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