![]() |
Probelm mit WorkerThread...
Hallo, ich verwende die Class TWorkerThread aus diesem Beitrag:
![]() Ich habe mir davon eine eigene Klasse abgeleitet, welche noch eine Kontrollvariable enthält, sowie die zu verarbeitenden Daten. Mittels der kontrollvariable soll geprüft werden ob die Daten verarbeitet werden dürfen oder nicht. Das ganze Klappt auch soweit, bis ich die variable verändern will. Danach kommt es zur Exception, weil der thread wahrscheinlich im selben Moment, indem ich die Kontrollvariable verändern will darauf zugreifen will. Wie kann ich das ganze umgehen? Hier mal der Execute code von meinem Thread:
Delphi-Quellcode:
procedure TThreadLivetrack.Execute(aThread: TWorkerThread);
Const szMsg = 'Executed by thread #%d'; begin inherited; //showmessage('ausgeführt'); if self.fIsEnd then exit; //Livetrack download; try self.fLivetrack.download(5000) except end; self.FLivetrack.refresh(self.fName,self.fATC,self.fTool); //livetrack refresh try self.fLivetrack.ConnectFTP(7000); except end; try self.fLivetrack.upload() except end; try self.fLivetrack.UploadInfoDaten() except end; self.flivetrack.DisconnectFTP; self.fisend := true; //showmessage('ausgeführt'); end; |
Re: Probelm mit WorkerThread...
Hallo,
um welche Kontrolvariable geht es denn? Der Workerthread arbeitet einzelne Jobs ab, die Du in die Jobliste einfügst. Wenn ein Job abgearbeitet ist, wird der Job innerhalb des Threadpools weggeschmissen (per Free). Du kannst also nicht von außen auf diesen Job zugreifen, weil Du eben nicht weisst, wann er abgearbeitet wurde (und damit nicht mehr gültig ist). Du kannst aber vom Job aus signalisieren, das die Abarbeitung gestartet bzw. beendet wurde. Dazu setzt Du innerhalb des Jobs beim Execute das Signal 'gestartet' und in der letzten Zeile das Signal 'beendet'. Wie das Signal im Einzelnen aussieht, bleibt dir überlassen. Bei der Verwendung der VCL beachte bitte, das das über die 'Synchronize'-Methode des Workerthreads erfolgen muss. Ein Beispiel ist ja im Demo-Projekt angegeben. |
Re: Probelm mit WorkerThread...
Also versteh ich das jetzt so richtig:
Ich füge einen Job in den Pool ein, dieser ist abgearbeitet und wird dann vom Pool selbst verworfen? Das heißt ich muss Ihn nicht wieder freigeben? er ist dann weg? |
Re: Probelm mit WorkerThread...
Ja. Steht so im Code. Und ist auch so gedacht. Du kannst doch gar nicht wissen, wann der Job abgearbeitet ist. Ich verwende den Threadpool immer so:
Delphi-Quellcode:
...
PendingJobs.Add(TMyJob.Create(aParameter, anotherParameter)); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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-2025 by Thomas Breitkreuz