Thema: Delphi Warten auf Thread Ende

Einzelnen Beitrag anzeigen

4lb3rtO

Registriert seit: 11. Okt 2011
11 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Warten auf Thread Ende

  Alt 14. Mär 2013, 16:02
Vielen Dank für die zahlreichen Hinweise und Tipps Ich habe nun einmal die angesprochenen Änderungen eingefügt. Die read-property und die Variable habe ich entfernt, da sie im späteren Verlauf auch nicht benötigt wird.
Leider funktioniert hier bei der DP kein Line-Highlighting (gelöschte Zeilen rot, neue Zeilen grün markieren/hinterlegen) um die Änderungen besser sichtbar zu machen
Hier einmal der aktuelle Quelltext.

Die Animation wird mit folgendem Code angezeigt...
{Unit1}
Delphi-Quellcode:
  private
    procedure SetBusyAnimation(Value: Boolean);
  public
    property BusyAnimation: Boolean write SetBusyAnimation;
  end;
Delphi-Quellcode:
procedure TXMFS.FormCreate(Sender: TObject);
begin
  (Image2.Picture.Graphic as TGIFImage).Animate := True;
  (Image2.Picture.Graphic as TGIFImage).AnimationSpeed := 210;
end;
Delphi-Quellcode:
procedure TXMFS.SetBusyAnimation(Value: Boolean);
begin
  Image2.Visible := Value;
end;

Den Thread erzeuge ich bspw. so...
{Unit1}
Delphi-Quellcode:
  TGMD := TThreadGetMBData.Create('artist', 'artist', XMFS.Edit1.Text, '5', True);
  TGMD.FreeOnTerminate := True;
  TGMD.Start;

Thread...
{Unit2}
Delphi-Quellcode:
  TThreadGetMBData = class(TThread)
  private
    FTyp: String;
    FQuery: String;
    FInput: String;
    FLimit: String;
    FShow: Boolean;
    procedure NotifyEndOfThread(Sender: TObject);
    procedure GetMBData(Typ, Query, Input, Limit: String);
  protected
    procedure Execute; override;
  public
    constructor Create(const ATyp, AQuery, AInput, ALimit: String; AShow: Boolean);
  end;
Delphi-Quellcode:
constructor TThreadGetMBData.Create(const ATyp, AQuery, AInput, ALimit: String; AShow: Boolean);
begin
  inherited Create(True);
  XMFS.BusyAnimation := True;
  FTyp := ATyp;
  FQuery := AQuery;
  FInput := AInput;
  FLimit := ALimit;
  FShow := AShow;
end;
GetMbData lädt dann die entsprechende Datei herunter
Delphi-Quellcode:
procedure TThreadGetMBData.Execute;
begin
  CoInitialize(nil);
  GetMBData(FTyp, FQuery, FInput, FLimit);
  OnTerminate := NotifyEndOfThread;
end;
Hier wird nach Thread-Ende die xml-Daten ausgelesen und die Animation versteckt
Delphi-Quellcode:
procedure TThreadGetMBData.NotifyEndOfThread(Sender: TObject);
begin
  if FTyp = 'artistthen
    Mb.ReadArtistData(FShow);
  if FTyp = 'release-groupthen
    Mb.ReadReleaseGroupData(FShow);

  XMFS.BusyAnimation := False;
end;


Jetzt müsste ich nur noch bei Bedarf auf die Fertigstellung des Threads warten können, dann wäre es perfekt. Ich glaube ich habe auch mich im ersten Post in der Beziehung etwas missverständlich ausgedrückt. Im Hauptthread müsste ich nach der Erzeugung des Nebenthreads die Möglichkeit haben, auf dessen Fertigstellung zu warten.
Vielleicht auch den Status des Threads abfragen, ob ein Fehler aufgetreten ist?!

Wenn man nun bspw. den Thread wie folgt erzeugt, funktioniert die Animation aufgrund des "WaitFor" und des "Free" nicht mehr
Delphi-Quellcode:
  TGMD := TThreadGetMBData.Create('artist', 'artist', XMFS.Edit1.Text, '5', True);
  TGMD.FreeOnTerminate := False;
  TGMD.Start;

  TGMD.WaitFor;

  // Mach noch etwas

  TGMD.Free;

Was für Möglichkeiten hätte man alternativ um dort eine Pause einzulegen, ohne den Hauptthread einzufrieren und die Animation anzuzeigen?
Änderungsvorschläge und Kritik sind nach wie vor erwünscht Das blöde an der Geschichte ist, das es mehrere solcher Threads gibt und sich das durch das gesamte Programm zieht...
Vielen Dank bis dato
  Mit Zitat antworten Zitat