Tja, natürlich habe ich auch die Sychronize Sache gesehen, aber was soll ich hier sychronisieren?
Den Zugriff auf dein Fenster. Denn das dürfen Threads nicht einfach anfassen.
Einfach runtergeschrieben und nicht getestet, aber dafür vermutlich mehr wie es gedacht ist.
Delphi-Quellcode:
unit MainFormUnit;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.WinXCtrls,
Vcl.ExtCtrls;
type
TheThread =
class(TThread)
private
procedure DoIt;
public
procedure Execute;
override;
end;
type
TMainForm =
class(TForm)
Indicator: TActivityIndicator;
CounterLabel: TLabel;
StartThreadBtn: TButton;
procedure StartThreadBtnClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
// *************************************************
procedure TheThread.DoIt;
begin
MainForm.Indicator.Animate := true;
end;
procedure TheThread.Execute;
begin
Synchronize(DoIt);
end;
// *************************************************
procedure TMainForm.StartBtnClick(Sender: TObject);
var
Thread: TheThread;
I: integer;
begin
try
// Thread starten
Thread := TheThread.Create(True);
Thread.FreeOnTerminate := true;
Thread.Resume;
// eine reine Beschäftigungsaufgabe für den Hauptthread
for I := 0
to 100
do
begin
MainForm.CounterLabel.Caption := I.tostring;
Application.ProcessMessages;
Sleep(500);
end;
MainForm.Indicator.Animate := false;
except
on E:
Exception do
begin
MainForm.Indicator.Animate := false;
end;
end;
end.