Hallo Leute
Ich hätte mal eine Frage zum Thread-Design und dem Warten auf das Ende eines Threads. Mit Threads in Delphi stehe ich mehr oder weniger immer auf Kriegsfuß
Um während einer Wartezeit (z.B. auf einen Download) eine Animation sehen zu können, lasse ich mir in einem Image eine Gif-Animation anzeigen. Der Download selbst wird in einem Thread ausgeführt.
Die Animation wird mit folgendem Code angezeigt...
{Unit1}
Delphi-Quellcode:
private
FBusyAnimation : Boolean;
procedure SetBusyAnimation(Value: Boolean);
public
property BusyAnimation: Boolean read FBusyAnimation 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
FBusyAnimation := Value;
if FBusyAnimation then
Image2.Visible := True
else
Image2.Visible := False;
end;
Den Thread erzeuge ich bspw. so...
{Unit1}
Delphi-Quellcode:
SetBusyAnimation(True);
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;
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);
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);
try
GetMBData(FTyp, FQuery, FInput, FLimit);
finally
Synchronize(NotifyEndOfThread);
end;
end;
Hier wird nach Thread-Ende die Animation versteckt und
xml-Daten ausgelesen
Delphi-Quellcode:
procedure TThreadGetMBData.NotifyEndOfThread;
begin
XMFS.BusyAnimation := False;
if FTyp = 'artist' then
Mb.ReadArtistData(FShow);
if FTyp = 'release-group' then
Mb.ReadReleaseGroupData(FShow);
end;
Ist der Thread und dessen Aufruf so in Ordnung?
Ab und zu kann es nun allerdings vorkommen, das ich nach dem Erzeugen des Threads auf seine Fertigstellung warten muss. Ach wenn ich den Sinn und Zweck eines Threads damit wieder zunichte mache. Letztenendes geht es eigentlich nur um die Animation. Hierzu hatte ich nach dem Create ein "FreeOnTerminate := False" und "WaitFor" verwendet, was jedoch nicht wie gewünscht funktionierte. Muss ich stattdessen WaitForSingleObject verwenden? Oder ein Flag bzw. ein Event?
Bin für jeden Hinweis dankbar, da dies quasi meine ersten Gehversuche mit Threads sind.
Schöne Grüße
4lb3rtO