程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 如何顯示子線程的當前狀態

如何顯示子線程的當前狀態

編輯:Delphi
  如何顯示子線程的當前狀態          剛剛完成的一個小程序是分析使用豎向排列的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;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved