Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Warten bis Prozedur in Thread ausgeführt wurde (https://www.delphipraxis.net/72451-warten-bis-prozedur-thread-ausgefuehrt-wurde.html)

Sascha L 30. Jun 2006 11:35


Warten bis Prozedur in Thread ausgeführt wurde
 
Hallo,

ich habe eine eigene Komponente geschrieben, in der ein Thread verwendet wird.

Die Komponente hat 2 Prozeduren "Start" und "Stop" mit denen ich den Thread anhalten/fortsetzen kann (Suspend := true/false).

Die Execute-Prozedure vom Thread sieht so aus:

Delphi-Quellcode:
while not Terminated do begin
  {...}
end;
Das Problem ist nun, dass mit "Stop" der Thread erst dann angehalten werden darf, wenn alles in der While-Schleife ausgeführt wurde.

Nun habe ich es mit einer globalen Variable ausprobiert, die am Ende auf true gesetzt wird, aber das funktioniert leider nicht.

Wie kann ich den Thread also erst dann pausieren, wenn alles in der While-Schleife ausgeführt wurde?

Gruß
Sascha

marabu 30. Jun 2006 12:20

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Hallo Sascha,

deine Idee mit der Variable ist doch nicht schlecht - es kommt darauf an, wie du sie verwendest:

Delphi-Quellcode:
type
  TDemoThread = class(TThread)
  private
    Suspending: Boolean;
  protected
    procedure Execute; override;
    procedure Start;
    procedure Stop;
  end;

implementation

procedure TDemoThread.Execute;
begin
  while not Terminated do
  begin
    // ...
    Suspended := Suspending;
  end;
end;

procedure TDemoThread.Start;
begin
  Suspending := False;
end;

procedure TDemoThread.Stop;
begin
  Suspending := True;
end;
Grüße vom marabu

Sascha L 30. Jun 2006 13:26

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Das Problem ist, dass der Thread IN der Komponente ist:

Delphi-Quellcode:
MyComp = Class(TGraphicControl)
 private
 fThread: TThread
Die Start- und Stop-Prozeduren werden von der Komponente aus aufgerufen.

dimo 30. Jun 2006 13:39

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Delphi-Quellcode:
while not Terminated do begin
   // Do something
   suspend;
end;

Sascha L 30. Jun 2006 13:52

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Ne, der soll ja nicht nachdem er es einmal ausgeführt hat, sofort anhalten, sondern nur, wenn man MyCom.Stop aufruft.

dimo 30. Jun 2006 14:03

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Was ist mit dem Suspending-Beispiel von oben? Wieso geht dieser nicht?

dimo 30. Jun 2006 14:16

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Da ich mich jetzt verabschieden werde, wollte ich dir vielleicht noch ein Tipp geben: du könntest Mutex dafür verwenden. Mehr darüber findest du in winsdk unter CreateMutex, CloseHandle, WaitForSingleObject, ReleaseMutex.
Gruß und schönes WE,
Dimo

Khabarakh 30. Jun 2006 14:42

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Zitat:

Zitat von Sascha L
Das Problem ist, dass der Thread IN der Komponente ist:

Hm, ich erkenne da kein Problem. Oder soll Stop asynchron aufgerufen werden, der Mainthread also auf das Ende des Nebenthreads warten?

Sascha L 1. Jul 2006 20:52

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Also:

Ich habe eine Komponente, die wir nun mal MyComp nennen. Diese Komponente beinhaltet einen Thread (fThread: TThread). Dieser Thread wird beim Erzeugen der Komponente auch erzeugt und gestartet.

Die Komponente hat eine Prozedur "Stop" (also NICHT die Thread-Klasse!). Wenn ich Stop ausführe, soll der Thread ANGEHALTEN werden, aber erst dann, wenn der Thread mit den Aufgaben in der "while not Terminated"-Schleife fertig ist bzw. am Ende angelangt ist, bevor er dann wieder von vorne anfängt.

marabu 1. Jul 2006 21:29

Re: Warten bis Prozedur in Thread ausgeführt wurde
 
Ein paar kleine Anpassungen für den Code aus Beitrag #2:


Delphi-Quellcode:
type
  TDemoThread = class(TThread)
  private
    Suspending: Boolean;
  protected
    procedure Execute; override;
  end;

  TMyComponent = class(TGraphicControl)
  private
    FThread: TThread;
  public
    procedure Start;
    procedure Stop;
  end;


implementation

procedure TDemoThread.Execute;
begin
  while not Terminated do
  begin
    // ...
    Suspended := Suspending;
  end;
end;

procedure TMyComponent.Start;
begin
  FThread.Suspending := False;
end;

procedure TMyComponent.Stop;
begin
  FThread.Suspending := True;
end;
marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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