教程搜索
相关教程
- 利用Delphi和金山词霸制作批量单词翻译
- Delphi2005的使用感受
- delphi2005启动加快
- ShadowStarCodeFastV0.5支持HTML格式拷
- Delphi组件编写--扑克牌组件
- delphi7找不到TBDEClientDataSet控件的
- 动态连接数据库及动态建立ODBC,DSN(ZT
- DelphiINPUTHelperv1.5forDelphi2005
- 如何显示子线程的当前状态
- delphi调用sql-server2000存储过程
- 对TMemoryStream的一些改进
- ShadowStarCodeFast截图
- 代码优化分析一例
- Delphi中的属性property(适合初学del
- 小知识:MPEG音频压缩规格一览
- SQLServer注入工具1.0
图文教程
赞 助 商
如何显示子线程的当前状态
- 来源:e股脑
- 点击次数:
- 更新时间:2007-8-9
如何显示子线程的当前状态
刚刚完成的一个小程序是分析使用竖向排列的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;






