AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Warten bis Prozedur in Thread ausgeführt wurde
Thema durchsuchen
Ansicht
Themen-Optionen

Warten bis Prozedur in Thread ausgeführt wurde

Ein Thema von Sascha L · begonnen am 30. Jun 2006 · letzter Beitrag vom 1. Jul 2006
Antwort Antwort
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#1

Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 11:35
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
Sascha
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 12:20
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
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 13:26
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.
Sascha
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#4

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 13:39
Delphi-Quellcode:
while not Terminated do begin
   // Do something
   suspend;
end;
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 13:52
Ne, der soll ja nicht nachdem er es einmal ausgeführt hat, sofort anhalten, sondern nur, wenn man MyCom.Stop aufruft.
Sascha
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#6

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 14:03
Was ist mit dem Suspending-Beispiel von oben? Wieso geht dieser nicht?
  Mit Zitat antworten Zitat
dimo

Registriert seit: 28. Okt 2005
22 Beiträge
 
#7

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 14:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 30. Jun 2006, 14:42
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?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 1. Jul 2006, 20:52
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.
Sascha
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Warten bis Prozedur in Thread ausgeführt wurde

  Alt 1. Jul 2006, 21:29
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
  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 23:51 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