AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probelm mit WorkerThread...

Ein Thema von SimStar001 · begonnen am 31. Mai 2009 · letzter Beitrag vom 31. Mai 2009
Antwort Antwort
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#1

Probelm mit WorkerThread...

  Alt 31. Mai 2009, 16:57
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;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Probelm mit WorkerThread...

  Alt 31. Mai 2009, 18:16
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#3

Re: Probelm mit WorkerThread...

  Alt 31. Mai 2009, 18:49
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?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Probelm mit WorkerThread...

  Alt 31. Mai 2009, 20:04
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));
...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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