AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einfrieren trotz WaitForSingleObject

Ein Thema von TheMiller · begonnen am 26. Mär 2008 · letzter Beitrag vom 26. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 15:42
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 15:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 15:47
Was meinst du mit einer lann Aufrufkette? Das steht im Button1.OnCli
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 15:55
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....
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 15:57
Hm... also geht das mit WaitForSingleObject so nicht. Was kann ich stattdessen benutzen?
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 15:59
Du kannst z.B. das Ereignis TThread.OnTerminate verwenden.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#7

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 16:00
Also muss ich zwangsläufig in eine neue Prozedur einsteigen und kann ich an der gleichen Stelle, also beim Aufruf weitermachen, richtig?
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 16:04
das interessiert mich jetzt auch mal...
würde sowas gehen?
Delphi-Quellcode:
  Dt.Resume;
  while not Dt.terminated do
    Application.Processmessages;
  ShowMessage('SDD');
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#9

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 16:05
Ja, aber ich denke, dass das den Vorteil eines Threads wieder zertört, weil permanent geprüft wird, ob der Thread zu Ende ist.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Einfrieren trotz WaitForSingleObject

  Alt 26. Mär 2008, 16:11
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).
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:59 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