Delphi-PRAXiS
Seite 2 von 4     12 34      

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 Fehlermeldung "Element hat kein übergeördnetes Fenster" (https://www.delphipraxis.net/129393-fehlermeldung-element-hat-kein-uebergeoerdnetes-fenster.html)

DevidEspenschied 18. Feb 2009 11:11

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Zitat:

Zitat von himitsu
ja und dann wird es hier auch immer wieder gesagt: prüfe nicht auf True und False
Delphi-Quellcode:
while not Terminated do

Mit dieser Änderung ist der Fehler aber nachwievor drin und reproduzierbar.

himitsu 18. Feb 2009 11:13

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Zitat:

Zitat von devidespe
Mit dieser Änderung ist der Fehler aber nachwievor drin und reproduzierbar.

hab ja nicht gesagt, das es DER Fehler war :angel2:

PS: hatte oben etwas nachgetragen
und ich hab hier grad 'nen D2009 auf.

DevidEspenschied 18. Feb 2009 11:19

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Okay, das ist schon mal etwas brauchbares. Wie kann ich abfragen, ob ein Thread nach Terminate geschlossen ist ? Die Suspend-Eigenschaft kann ich nicht nehmen, da die nur für die vorübergehende Pause von Threads zuständig ist. Es gibt wohl noch Terminated, darauf kann ich aber von der VCL nicht zugreifen.

Als zusätzliche Maßnahme wollte ich wie vorgeschlagen in DoThread prüfen, ob das das Fenster noch existiert. Kannst Du dafür evtl. auch einen Tipp geben ?

Danke schon mal im voraus.

himitsu 18. Feb 2009 11:34

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
.Terminated sagt nur, daß der Thread beendet werden soll, aber nicht ob er schon beendet wurde.

Entweder du setzt eine Ereignisprozedur für .OnTerminate und setzt dort etwas in deinem Programm

wenn du in ReturnValue setzt ( <> 0), dann könnte man über ThreadID bestimmt den Wert abfragen.

oder ganz einfach, du machst in deinen TThread-Abkömmling einen neuen Wert (z.B. Boolean), welcher beim Start False ist und setzt den am Ende deiner .Execute diesen via Synchronize auf True und fragst diesen dann in der Schleife ab.

jbg 18. Feb 2009 11:35

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Wie wäre es damit:
Delphi-Quellcode:
  Th1.Terminate;
  Th2.Terminate;
  Th3.Terminate;
  Th1.WaitFor;
  Th2.WaitFor;
  Th3.WaitFor;
  Close;
Zuvor muss aber noch das "while (True)" aus allen Threads raus.

himitsu 18. Feb 2009 11:45

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
ahh, WaitFor garb's ja och noch ... hatte da nur erst die Angst, daß dieses die Nachrichtenschleife nicht weiter abrbeiten würde und so 'ne Endlosschleife entstünde :oops:

aber es geht :angel:

DevidEspenschied 18. Feb 2009 11:45

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Zitat:

Zitat von himitsu
oder ganz einfach, du machst in deinen TThread-Abkömmling einen neuen Wert (z.B. Boolean), welcher beim Start False ist und setzt den am Ende deiner .Execute diesen via Synchronize auf True und fragst diesen dann in der Schleife ab.

Also etwa so:

Delphi-Quellcode:
TBeispielThread1 = class (TThread)
  private
    FMemo: TMemo;
  protected
    procedure Execute; override;
    procedure StarteThread;
    procedure DoThread;
  public
    Beendet : Boolean;
    constructor Create(Memo: TMemo; ThreadPriority: TThreadPriority);
  end;

constructor TBeispielThread1.Create(Memo: TMemo; ThreadPriority: TThreadPriority);
begin
  inherited Create(False);
  Priority:=ThreadPriority;
  FMemo:=Memo;
  Beendet:=False;
end;

procedure TBeispielThread1.Execute;
begin
  while not Terminated do begin sleep(1); StarteThread; end;
  Beendet:=True;
end;
Und dann mit der Schleifenabfrage:

Delphi-Quellcode:
 while (Th1.Beendet=False) or (Th2.Beendet=False) or (Th3.Beendet=False) do
  begin
    Sleep(10);
    Application.ProcessMessages;
  end;
Edit: Habe jetzt WaitFor genommen und es läuft ohne Fehler. Jetzt gibt es noch das Problem, dass ich jeweils in .DoThread prüfen will, ob das das Fenster noch existiert.

himitsu 18. Feb 2009 11:52

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Zitat:

Zitat von devidespe
Jetzt gibt es noch das Problem, dass ich jeweils in .DoThread prüfen will, ob das das Fenster noch existiert.

wenn du das Fenster nicht schließt, bevor die Threads beendet sind, ist das eigentlich nicht mehr nötig.

quendolineDD 18. Feb 2009 11:56

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Ich habe in meinen Execute-Methoden meiner Threads oft in der Schleife eine Variable, die ich von außen setzen kann.
Delphi-Quellcode:
while CanRun do
Und im Hauptprogramm
Delphi-Quellcode:
Thread.CanRun := False;
Thread.Terminate;
Thread.WaitFor;
Und gewöhn dir mal ab, auf False und True abzufragen sondern nutze logische Operatoren wie NOT, AND, OR usw.

Also bei dir
Delphi-Quellcode:
while (not Th1.Beendet) and (not Th2.Beendet) and (not Th3.Beendet) do
Vielleicht solltest du dir auch überlegen anstatt auf Beendet abzufragen ob er noch laufen darf, dann musst du nicht immer alles negiert denken. Das macht es auch einfacher ...

Und du solltest auch strikt VCL und Threads voneinander trennen. Die Threads machen keinen Sinn wenn du andauernd über Synchronize auf den Mainthread zugreifst.
Einfach wie himitsu sagt, dafür sorgen das die Threads beendet werden, bevor das Fenster beendet wird.

himitsu 18. Feb 2009 12:05

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
@quendolineDD: für den CanRun gibt es die .Terminated Variable im Thread.
Setzt man diese (z.B. durch den Aufruf von .Terminate) auf True, muß sich der Thread selbst beenden.


Zitat:

Die Threads machen keinen Sinn wenn du andauernd über Synchronize auf den Mainthread zugreifst.
och, das seh ich jetzt nur mal als "einfachen" Testcode an, mit welchem er seine Threads testen möchte :angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.
Seite 2 von 4     12 34      

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