在 Delphi 應用程式中,我使用計時器以不同的時間間隔(如 10 秒、5 分鐘、1 小時等)進行一些例行檢查。如果我使用計時器GetTickCount()檢查間隔,那么當機器從睡眠狀態恢復時,所有事件都會同時觸發。如果我使用計時器呼叫檢查間隔,那么每當我的應用程式由于機器性能或應用程式執行繁重的處理而變慢時,計時器也會停止并且我的所有變數都會累積滯后。
什么是正確的做法?精度并不重要,一個小時內大約 2 秒的變化就可以了。
uj5u.com熱心網友回復:
對于這樣的任務,我更喜歡某種“看門狗”執行緒:
TWatchdog = class(TThread)
private
fEvt : TSimpleEvent;
protected
procedure Execute; override;
public
procedure SigTerminate;
constructor Create;
destructor Destroy; override;
end;
implementation
procedure TWatchdog.Execute;
begin
NameThreadForDebugging('Watchdog');
while not Terminated do
begin
// ###########################################
// #### Main loop - execute every 10sec
if fEvt.WaitFor( 10000 ) = wrTimeout then
begin
// ###########################################
// #### Main procedures (returns false in case of error)
if not DoTestHere then
break;
end;
end;
end;
procedure TWatchdog.SigTerminate;
begin
Terminate;
fEvt.SetEvent;
end;
constructor TWatchdog.Create;
begin
fEvt := TSimpleEvent.Create(nil, True, False, '');
// Start immediately
inherited Create(False);
end;
它不會阻止您的主 gui 代碼,但您需要確保您的測驗代碼是執行緒保存的,并且不涉及任何 vcl/firemonkey gui 元素。
停止應用程式時,只需呼叫SigTerminate并等待執行緒停止(呼叫執行緒WaitFor函式)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513247.html
標籤:德尔福计时器
上一篇:如何生成不重復的亂數
下一篇:按比例調整面板大小
