AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Funktionsweise Thread.WaitFor
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsweise Thread.WaitFor

Ein Thema von SyntaxXx · begonnen am 13. Aug 2014 · letzter Beitrag vom 12. Jan 2021
Antwort Antwort
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#1

Funktionsweise Thread.WaitFor

  Alt 13. Aug 2014, 14:55
Hallo zusammen,
ich habe gerade Probleme mit den Threads.
Ich möchte gerne irgendwie warten, bis ein Thread erfolgreich beendet wurde.
Dafür habe ich nun die Methode "WaitFor" gefunden.
Nur verstehe ich die Funktionsweise nicht.

Hier der Aufbau meiner Anwendung:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    importList: TStringList;
  public
    { Public-Deklarationen }
  end;

  TThread1 = class(TThread)
    protected
      procedure Execute; override;
    private
      IdHTTP1: TIdHTTP;
      page: String;
      response: String;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TThread1.Execute;
begin
  IdHTTP1 := TIdHTTP.Create();
  self.response := IdHTTP1.Get(self.page);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Thread1: TThread1;
begin
    Thread1 := TThread1.Create(True);
    Thread1.FreeOnTerminate := True;
    Thread1.response := 'Foo';
    Thread1.page := 'http://google.de';
    Thread1.Start;

    showmessage(Thread1.response);
end;
end.
Es ist klar, dass ich jetzt nur eine Meldung mit "Foo" bekomme, da der Thread ja noch nicht beendet wurde.
Wie kann ich nun warten, bis der Thread beendet wurde um dann die Meldung auszugeben?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Funktionsweise Thread.WaitFor

  Alt 13. Aug 2014, 15:12
Wie kann ich nun warten, bis der Thread beendet wurde um dann die Meldung auszugeben?
Na eben mit Delphi-Referenz durchsuchenTThread.WaitFor ... allerdings ist es doof, wenn du den Thread automatisch beim Beenden ins Nirwana schickst. Von wem willst du dann noch was holen?

Und wenn du auf den Thread wartest, dann ist deine UI blockiert ... warum dann einen Thread?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Thread1: TThread1;
begin
    Thread1 := TThread1.Create(True);
    try
      // Thread1.FreeOnTerminate := True;
      Thread1.response := 'Foo';
      Thread1.page := 'http://google.de';
      Thread1.Start;
      Thread1.WaitFor;
    
      showmessage(Thread1.response);
    finally
      Thread1.Free;
    end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Funktionsweise Thread.WaitFor

  Alt 13. Aug 2014, 15:23
Ahhhh ok, das war einfach.
Ok, du hast recht, macht natürlich jetzt keinen Sinn, mit nem Thread zu arbeiten.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Funktionsweise Thread.WaitFor

  Alt 13. Aug 2014, 15:35
Du kannst natürlich OnTerminate etwas zuweisen. Das Ereignis wird ausgelöst, wenn der Thread fertig ist
Jens
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Funktionsweise Thread.WaitFor

  Alt 13. Aug 2014, 16:08
Und das tolle daran: OnTerminate wird sogar schon im Hauptthread ausgeführt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.336 Beiträge
 
Delphi 12 Athens
 
#6

AW: Funktionsweise Thread.WaitFor

  Alt 13. Aug 2014, 16:27
Und das tolle daran: OnTerminate wird sogar schon im Hauptthread ausgeführt.
Und das Allerbeste,

Man kann darin sogar auf Exceptions prüfen. Also die, welche im Thread auftrat und wodurch der Thread abgeschossen wurde.
Denn, im Gegensatz um Hauptthread, werden diese Exception zwar ebenfalls abgefangen, aber nicht dem Benutzer "angezeigt".

Der Grund, warum die RTL/VCL das macht: Windows beendet Prozesse, womit sich das ganze Programm verabschieden würde, wenn in irgendeinem Thread eine Exceptions bis zur Wurzel (ins Windows) durch rauscht.

Delphi-Referenz durchsuchenTThread.FatalException
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Aug 2014 um 16:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:46 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