Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Probelm mit WorkerThread... (https://www.delphipraxis.net/134884-probelm-mit-workerthread.html)

SimStar001 31. Mai 2009 15:57


Probelm mit WorkerThread...
 
Hallo, ich verwende die Class TWorkerThread aus diesem Beitrag: Workerthread: Der Diener im Hintergrund

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;

alzaimar 31. Mai 2009 17:16

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.

SimStar001 31. Mai 2009 17:49

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?

alzaimar 31. Mai 2009 19:04

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 13:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz