Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Einfrieren trotz WaitForSingleObject (https://www.delphipraxis.net/110903-einfrieren-trotz-waitforsingleobject.html)

TheMiller 26. Mär 2008 14:42


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:
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;
Allerdings bleibt das gesamte Programm trotzdem hängen, bis der Thread zu Ende ist. Warum ist das so?

danke

Muetze1 26. Mär 2008 14:45

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.

TheMiller 26. Mär 2008 14:47

Re: Einfrieren trotz WaitForSingleObject
 
Was meinst du mit einer lann Aufrufkette? Das steht im Button1.OnCli

Dani 26. Mär 2008 14:55

Re: Einfrieren trotz WaitForSingleObject
 
Zitat:

Zitat von DJ-SPM
Allerdings bleibt das gesamte Programm trotzdem hängen, bis der Thread zu Ende ist. Warum ist das so?

Weil, wie Muetze1 schon gesagt hat, WaitForSingleObject eben wartet, bis der Thread zuende ist, bevor die nächste Codezeile (ShowMessage) ausgeführt wird. Und da TContainer.SeekUpdates vom MainThread (= VCL-Thread = Graphische Oberfläche) aufgerufen wird....

TheMiller 26. Mär 2008 14:57

Re: Einfrieren trotz WaitForSingleObject
 
Hm... also geht das mit WaitForSingleObject so nicht. Was kann ich stattdessen benutzen?

Dani 26. Mär 2008 14:59

Re: Einfrieren trotz WaitForSingleObject
 
Du kannst z.B. das Ereignis TThread.OnTerminate verwenden.

TheMiller 26. Mär 2008 15:00

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?

dominikkv 26. Mär 2008 15:04

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');

TheMiller 26. Mär 2008 15:05

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.

Dani 26. Mär 2008 15:11

Re: Einfrieren trotz WaitForSingleObject
 
Wahrscheinlich würde es gehen, aber das istBusy Waiting

Zitat:

Also muss ich zwangsläufig in eine neue Prozedur einsteigen und kann ich an der gleichen Stelle, also beim Aufruf weitermachen, richtig?
Das verstehe ich nicht. Welche Stelle, welcher Aufruf, was für eine neue Prozedur?

€: 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 17:36 Uhr.
Seite 1 von 2  1 2      

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