如何显示子线程的当前状态
刚刚完成的一个小程序是分析使用竖向排列的24针打印头打印一个数据文件,分析每根针的出针次数等一些参数,给机械开发部门做寿命分析等等。
由于数据文件可能很大,分析时间会比较长,因此要能够显示分析进度,否则让比人以为程序死掉了那不是人生一大憾事。
因此,分析工作放在子线程中进行,通过产生“状态改变事件”和“分析结束事件”来通知主线程更新状态。线程定义如下:
//==================================
// MyThread.pas
//===================================//
TStatusChangedEvent = procedure (Percent: Integer) of Object; //状态改变事件
TFinishedEvent = procedure of Object; // 分析结束事件
TMyThread = class(TThread)
Private
FOnStatusChanged: TStatusChangedEvent;
FOnFinished: TFinishedEvent;
protected
procedure Execute; override;
public
OnStatusChanged: TStatusChangedEvent read FOnStatusChanged write FOnStatusChanged;
OnFinished: TFinishedEvent read FOnFinished write FOnFinished;
end;
procedure TMyThread.Execute;
var
Percent: Integer;
begin
...
if (Percent 发生了改变) and Assigned(FOnStatusChanged) then
FOnStatusChanged (Percent);
...
// 分析结束
if Assigned (FOnFinished) then
FOnFinished; // 在分析结束时通知主线程
end;
状态显示由一个窗体实现,该窗体有一个进度条,一个状态Label,一个取消按钮,以及一个定时器。定义如下(没有给出进度条、Label、按钮的代码)
//=====================================
// TFrmStatus.pas
//=====================================//
TFrmStatus = class (TForm) // 显示进度的窗体
Timer1: TTimer;
Procedure FormCreate (Sender: TObject);
Private
Procedure SetPercent (Value: Integer);
Procedure SetTerminate (Value: Boolean);
Public
Property Percent: Integer read FPercent write SetPercent;
Property Terminate: Boolean read FTerminate write SetTerminate;
End;
Procedure TFrmStatus. FormCreate (Sender: TObject);
begin
FTerminate := false;
Timer1.enable := false;
end;
procedure TFrmStatus. SetPercent(Value: Integer); // 设置百分比进度
begin
// 设置控件状态以表示当前的百分比进度
end;
[1] [2] 下一页 没有相关教程
|