unit tcountunit;
//simple TThread demo by Glenn9999
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TTCounter = class(TThread)
private
FCounter: Integer;
FLabel1: TLabel;
public
constructor Create(Label1: TLabel);
protected
procedure UpdateStuff;
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
TCounter: TTCounter;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
constructor TTCounter.Create(Label1: TLabel);
// constructor for the thread. Sets local storage for the label, initializes and
// creates thread.
begin
FLabel1 := Label1;
FCounter := 0;
inherited Create(false);
end;
procedure TTCounter.Execute;
// thread execution. Increments counter and updates a label on main form.
begin
FreeOnTerminate := True;
while not Terminated do
begin
inc(FCounter);
Synchronize(UpdateStuff);
sleep(10); // a delay is necessary so the program does not use a lot of CPU.
end;
end;
procedure TTCounter.UpdateStuff;
// procedure called by Synchronize. Must be parameterless.
begin
FLabel1.Caption := IntToStr(FCounter);
// you can also just directly address the form, too...
// Form1.Label1.Caption := IntToStr(FCounter);
end;
procedure TForm1.Button1Click(Sender: TObject);
// start counting thread.
begin
// shut down original thread if we restart.
if Assigned(TCounter) then
TCounter.Terminate;
TCounter := TTCounter.Create(Label1);
Button2.Enabled := true;
Button4.Enabled := true;
end;
procedure TForm1.Button2Click(Sender: TObject);
// pause counting thread, more to demo TThread.
begin
Button2.Enabled := false;
Button3.Enabled := true;
TCounter.Suspend;
end;
procedure TForm1.Button3Click(Sender: TObject);
// resume counting thread, more to demo TThread.
begin
Button2.Enabled := true;
Button3.Enabled := false;
TCounter.Resume;
end;
procedure TForm1.Button4Click(Sender: TObject);
// terminate counting thread, more to demo TThread.
begin
Button2.Enabled := false;
Button3.Enabled := false;
Button4.Enabled := false;
if Assigned(TCounter) then
TCounter.Terminate;
end;
procedure TForm1.FormDestroy(Sender: TObject);
// you want to make sure your thread gets shut down before main program does.
begin
if Assigned(TCounter) then
TCounter.Terminate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Enabled := false;
Button3.Enabled := false;
Button4.Enabled := false;
end;
end.