|
<< Click to Display Table of Contents >> Navigation: Demos > XI > Features > Threaded.pas |
//
unit Threaded;
interface
uses
IWAppForm, IWApplication,
SysUtils, Classes,
{$IFDEF Linux}QForms,{$ELSE}Forms,{$ENDIF}
{$IFDEF Linux}QControls,{$ELSE}Controls,{$ENDIF}
IWControl, IWHTMLControls, IWCompButton,
IWCompEdit, IWCompLabel, IWCompText, MenuFrame,
SyncObjs, IWExtCtrls, IWCompProgressBar, IWBaseControl, InGlobal,
IWBaseComponent, IWVCLBaseControl, IWBaseHTMLComponent, IWBaseHTMLControl,
IWBaseHTML40Component;
type
TTestThread = class(TThread)
private
FLock: TCriticalSection;
FPercentComplete: Integer;
//
function GetPercentComplete: Integer;
public
constructor Create; reintroduce;
destructor Destroy; override;
procedure Execute; override;
//
property PercentComplete: Integer read GetPercentComplete;
end;
TformThreaded = class(TIWAppForm)
IWText1: TIWText;
linkStart: TIWLink;
IWTimer1: TIWTimer;
lablPercentComplete: TIWLabel;
linkStop: TIWLink;
IWProgressBar1: TIWProgressBar;
linkBack: TIWLink;
procedure IWTimer1Timer(Sender: TObject);
procedure linkStartClick(Sender: TObject);
procedure linkStopClick(Sender: TObject);
procedure linkBackClick(Sender: TObject);
protected
FThread: TTestThread;
public
end;
implementation
{$R *.dfm}
uses
IWForm,
Main;
{ TTestThread }
constructor TTestThread.Create;
begin
inherited Create(False);
FLock := TCriticalSection.Create;
end;
destructor TTestThread.Destroy;
begin
FreeAndNil(FLock);
inherited;
end;
procedure TTestThread.Execute;
var
i: Integer;
begin
for i := 1 to 100 do begin
FLock.Enter; try
Inc(FPercentComplete);
finally FLock.Leave; end;
if Terminated then begin
Exit;
end;
Sleep(1000);
end;
Terminate;
end;
function TTestThread.GetPercentComplete: Integer;
begin
FLock.Enter; try
Result := FPercentComplete;
finally FLock.Leave; end;
end;
procedure TformThreaded.IWTimer1Timer(Sender: TObject);
begin
if FThread <> nil then begin
IWProgressBar1.Percent := FThread.PercentComplete;
lablPercentComplete.Caption := 'Percent Complete: ' + IntToStr(IWProgressBar1.Percent) + '%';
if FThread.Terminated then begin
linkStopClick(Sender);
end;
end;
end;
procedure TformThreaded.linkStartClick(Sender: TObject);
begin
linkStart.Visible := False;
linkBack.Visible := False;
linkStop.Visible := True;
IWTimer1.Enabled := True;
FThread := TTestThread.Create;
end;
procedure TformThreaded.linkStopClick(Sender: TObject);
begin
linkStart.Visible := True;
linkBack.Visible := True;
linkStop.Visible := False;
IWTimer1.Enabled := False;
lablPercentComplete.Caption := 'Thread Stopped';
FThread.Terminate;
FThread.WaitFor;
FreeAndNil(FThread);
end;
procedure TformThreaded.linkBackClick(Sender: TObject);
begin
Release;
TformMain.Create(WebApplication).Show;
end;
end.