Delphi TTimer запуски OnTime накладываются друг на друга

Событие OnTime компонента TTimer вызывается каждый раз по истечению количества мили секунд указанных в свойстве interval. Однако, если процедура, которая записана в событии OnTime не успевает отработать за время указанное в свойстве interval, то следующий запуск наложится на не завершенный текущее выполнение. Возможно это не критично для каких либо визуальных эффектов или вывода на экран, но для фоновых сервисов выполняющих сложные процедуры это может быть фатальным. В этом случае накладка вызовов процедур может создать пиковую нагрузку на ресурсы компьютера, где отрабатывает фоновая процедура. Поэтому в данном случае стоит потратить время на написание отдельного потока для обработки.

unit uThrdWorkFlow;
interface
  uses Classes, SysUtils, ADODB;
type
TThrdWorkFlow = class(TThread)
private
  FSleepTimeOut: Integer;
  procedure SetSleepTimeOut(const Value: Integer);
public<
  procedure Execute; override;
  property SleepTimeOut: Integer read FSleepTimeOut
    write SetSleepTimeOut;
end;
implementation
{ TThrdSync }
procedure TThrdWorkFlow.Execute;
begin
  inherited;
  while not Terminated do
  begin
    Sleep(SleepTimeOut);
  end;
end;
procedure TThrdWorkFlow.SetSleepTimeOut(const Value: Integer);
begin
  FSleepTimeOut := Value;
end;
end.

Теперь, пока не выполняться фоновая процедура и не пройдет интервал времени указанный в SleepTimeOut, новый запуск фоновой процедуры не начнется. В программе это можно будет использовать, например, так

{Создаем отдельный поток }
FThrdSync:= TThrdWorkFlow.Create(True);
{Указываем ему что при завршении он должен
сам освободить занимаемую память}
FThrdSync.FreeOnTerminate:= True;
{Запускаем выполнение фоновой процедуры}
FThrdSync.Resume;

……………….
{Жестко прерываем выполнение потока}
TerminateThread(FThrdSync.Handle, 0);

Функция TerminateThread находиться в юните Windows

Еще интересные записи по данной теме

Share

Tags: , ,

Leave a Reply