![]() |
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:
Das Problem ist nun, dass mit "Stop" der Thread erst dann angehalten werden darf, wenn alles in der While-Schleife ausgeführt wurde.
while not Terminated do begin
{...} end; 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 |
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:
Grüße vom marabu
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; |
Re: Warten bis Prozedur in Thread ausgeführt wurde
Das Problem ist, dass der Thread IN der Komponente ist:
Delphi-Quellcode:
Die Start- und Stop-Prozeduren werden von der Komponente aus aufgerufen.
MyComp = Class(TGraphicControl)
private fThread: TThread |
Re: Warten bis Prozedur in Thread ausgeführt wurde
Delphi-Quellcode:
while not Terminated do begin
// Do something suspend; end; |
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.
|
Re: Warten bis Prozedur in Thread ausgeführt wurde
Was ist mit dem Suspending-Beispiel von oben? Wieso geht dieser nicht?
|
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 |
Re: Warten bis Prozedur in Thread ausgeführt wurde
Zitat:
|
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. |
Re: Warten bis Prozedur in Thread ausgeführt wurde
Ein paar kleine Anpassungen für den Code aus Beitrag #2:
Delphi-Quellcode:
marabu
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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