如何显示子线程的当前状态

王朝delphi·作者佚名  2006-01-09
宽屏版  字体: |||超大  

如何显示子线程的当前状态

刚刚完成的一个小程序是分析使用竖向排列的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;

procedure TFrmStatus.SetTerminate(Value: boolean;) // 设置结束状态

begin

if FTerminate <> Value then

begin

FTerminate := Value;

Timer1.Interval := 2;

Timer1.Enable := true;

end;

end;

procedure TFrmStatus.Timer1Timer(Sender: TObject); // 响应定时器,关闭窗口,返回mrOk

begin

Close;

ModalResult := mrOk;

end;

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

主窗体负责创建分析线程和状态显示窗体,并响应分析线程产生的“状态改变事件”和“分析结束事件”。

// 主窗体

TFrmMain := class(TForm)

private

FFrmStatus: TFrmStatus;

procedure DoStatusChange(Percent: Integer); // 响应分析进度改变事件

procedure DoFinished; // 响应分析结束事件

public

procedure Do;

end;

// 运行分析

procedure TFrmMain.Do;

var

MyThread: TMyThread;

FrmStatus: TFrmStatus;

begin

try

MyThread := TMyThread.Create(true);

MyThread.OnStatusChange := DoStatusChange;

MyThread.OnFinished := DoFinished;

try

FrmStatus := TFrmStatus.Create(nil);

FFrmStatus := FrmStatus;

MyThread.Resume; // 启动线程

if FrmStatus.ShowModal = mrOk then

ShowAnalyseResult; // 显示分析结果

finally

FFrmStatus := nil;

FrmStatus.Free;

end;

finally

MyThread.FreeOnTerminate := true;

MyThread.Terminate;

end;

end;

// 响应状态改变事件,显示进度

procedure TFrmMain.DoStatusChange(Percent: Integer)

begin

if FFrmStatus <> nil then

FFrmStatus.Percent := Percent;

end;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有