![]() |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
|
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
PS: hatte oben etwas nachgetragen und ich hab hier grad 'nen D2009 auf. |
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. |
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. |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Wie wäre es damit:
Delphi-Quellcode:
Zuvor muss aber noch das "while (True)" aus allen Threads raus.
Th1.Terminate;
Th2.Terminate; Th3.Terminate; Th1.WaitFor; Th2.WaitFor; Th3.WaitFor; Close; |
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: |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
Delphi-Quellcode:
Und dann mit der Schleifenabfrage:
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;
Delphi-Quellcode:
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.
while (Th1.Beendet=False) or (Th2.Beendet=False) or (Th3.Beendet=False) do
begin Sleep(10); Application.ProcessMessages; end; |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
|
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:
Und im Hauptprogramm
while CanRun do
Delphi-Quellcode:
Und gewöhn dir mal ab, auf False und True abzufragen sondern nutze logische Operatoren wie NOT, AND, OR usw.
Thread.CanRun := False;
Thread.Terminate; Thread.WaitFor; Also bei dir
Delphi-Quellcode:
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 ...
while (not Th1.Beendet) and (not Th2.Beendet) and (not Th3.Beendet) do
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. |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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