![]() |
Einfrieren trotz WaitForSingleObject
Hallo,
ich habe einen MainThread, eine Container-Klasse und einen Thread. Der Thread wird aus der Containerklasse gestartet und in der Prozedur soll gewartet werden, bis der Thread zu Ende ist. Das versuche ich mittel "WaitForSingleObject" wie folgt:
Delphi-Quellcode:
Allerdings bleibt das gesamte Programm trotzdem hängen, bis der Thread zu Ende ist. Warum ist das so?
procedure TContainer.SeekUpdates;
var Dt: TDownloadThread; begin Dt:=TDownloadThread.Create(True); Dt.FreeOnTerminate:=True; Dt.FParent:=Self; Dt.SeekUpdates:=True; Dt.Resume; WaitForSingleObject(Dt.Handle, 1000000); ShowMessage('SDD'); end; danke |
Re: Einfrieren trotz WaitForSingleObject
Naja, wenn du von deinem Programm aus eine lange Aufrufkette hast bis zu der TContainer.SeekUpdates Methode, dann steht er dann in der WaitForSingleObject(), bis entweder der TimeOut zuschlägt oder halt das Objekt signalisiert. Somit steht deine Anwendung im Endeffekt im (angenommenen) Button1 Click.
Mit anderen Worten: Wenn du innerhalb deiner Oberfläche auf den Thread wartest, dann ist der Thread sinnlos. |
Re: Einfrieren trotz WaitForSingleObject
Was meinst du mit einer lann Aufrufkette? Das steht im Button1.OnCli
|
Re: Einfrieren trotz WaitForSingleObject
Zitat:
|
Re: Einfrieren trotz WaitForSingleObject
Hm... also geht das mit WaitForSingleObject so nicht. Was kann ich stattdessen benutzen?
|
Re: Einfrieren trotz WaitForSingleObject
Du kannst z.B. das Ereignis TThread.OnTerminate verwenden.
|
Re: Einfrieren trotz WaitForSingleObject
Also muss ich zwangsläufig in eine neue Prozedur einsteigen und kann ich an der gleichen Stelle, also beim Aufruf weitermachen, richtig?
|
Re: Einfrieren trotz WaitForSingleObject
das interessiert mich jetzt auch mal...
würde sowas gehen?
Delphi-Quellcode:
Dt.Resume;
while not Dt.terminated do Application.Processmessages; ShowMessage('SDD'); |
Re: Einfrieren trotz WaitForSingleObject
Ja, aber ich denke, dass das den Vorteil eines Threads wieder zertört, weil permanent geprüft wird, ob der Thread zu Ende ist.
|
Re: Einfrieren trotz WaitForSingleObject
Wahrscheinlich würde es gehen, aber das ist
![]() Zitat:
€: Ja, du musst den Code, der genau dann ausgeführt werden soll, wenn der Thread beendet ist, in eine neue Prozedur packen (also OnTerminate was zuweisen). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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 by Thomas Breitkreuz