Thema: Delphi Threadlogik Problem

Einzelnen Beitrag anzeigen

Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Threadlogik Problem

  Alt 22. Aug 2008, 18:15
Zitat von alias5000:
Warum soll das eine Endlosschleife sein?

Vom Verlauf her sieht das doch so aus:
Code:
1. Thread läuft in einer (abbrechbaren) Endlosschleife und sucht ständig nach so einem Fenster
 -
 -
\/
1. Thread findet ein Fenster, erstellt und startet einen WorkerThread
 -
 -
\/
Der Worker-Thread arbeitet nicht in einer Endlosschleife, sondern sendet eine Nachricht (WM_??) an das Fenster und dann ist die Execute-Methode vorbei
 -
 -
\/
1. Thread bekommt, wenn benötigt, über das OnTerminate Ereignis mit, wenn der WorkerThread fertig ist
Wenn du beim WorkerThread FreeOnTerminate auf True setzt, dann gibt er sich ja selbstständig frei, wenn die Execute-Methode rum ist und er sich somit terminiert.

Ist damit dein Problem geklärt, oder wohin solls genau gehen?

Gruß
alias5000
Also ich habs nu ungefähr so, dass Problem ist, das der WorkerThread nicht beendet, anstelle dessen sendet er ohne ende ne Nachricht an das Fremdfenster, dass soll er aber nur einmal machen, dass Problem ist, wie bekomme ich denn das so hin:

Der 1. Thread muss ja unendlich nach einem Fenster suchen, wenn diese gefunden wird den Workerthread starten, dieser sendet die Nachricht und soll sich beendet wenn die Nachricht versendet wurde, was aber wenn das Fenster Fremdfenster nicht geschlossen wurde? Thread1 startet ja dann wieder Thread2? Genau das ist ja das Problem.

Szenario 2
Thread1 findet das Fenster, Worker wird gestartet sendet die Nachricht und würde beendet werden, Fremdfenster wurde geschlossen.
Fremdfenster wird erneut aufgerufen, also wieder alles von vorne! Das ist mir völlig unklar logiktechnisch...

Ich zeigs mal per Code vielleicht wirds dann deutlicher:

Delphi-Quellcode:
constructor TMozWatchDogThread.Create;
begin
  inherited create(true);
   freeOnTerminate := true;
   Priority := tpLowest;
end;

destructor TMozWatchDogThread.destroy;
begin
  inherited destroy;
end;

procedure TMozWatchDogThread.Execute;
begin
  while not(Terminated = true) do
   begin
      // Suche Fenster wenn handle > 0 dann
      // StarteWorkerThread;
      // hat workerthread nachricht gesendet und ist fremdfenster geschlossen,
      // dann alles von vorne, hat worker nachricht gesendet aber fenster noch offen
      // dann nicht erneut nachricht an fremdfenster senden!
     end;
end;

{ TMozWatchDogWrokerThread }

constructor TMozWatchDogWorkerThread.create;
begin
  inherited create(true);
  freeOnTerminate := true;
  Priority := tpLowest;
end;

destructor TMozWatchDogWorkerThread.destroy;
begin
  inherited destroy;
end;

procedure TMozWatchDogWorkerThread.Execute;
begin
  // sende nachricht an fremdfenster, dann beende dich selber

end;
Gruss
s!
  Mit Zitat antworten Zitat