Приложение Delphi, над которым я работаю, должно задерживаться на один, а иногда на два, второй (и). Я хочу запрограммировать эту задержку, используя лучшие практики. При чтении записей о методе Delphi Sleep() в stackoverflow я нашел эти два комментария:
Я живу по этой максиме: "Если вы чувствуете необходимость использовать Sleep(), вы делаете это неправильно". - Ник Ходжес Мар 12 '12 в 1:36
@nick Действительно. Мой эквивалент: "Нет проблем, для которых Сон - это решение". - Дэвид Хеффернан Мар 12 '12 в 8:04
В ответ на этот совет, чтобы избежать вызова Sleep(), наряду с моим пониманием использования классов Delphi TTimer и TEvent, я запрограммировал следующий прототип. Мои вопросы:
- Это правильный способ запрограммировать задержку?
- Если да, то почему это лучше, чем вызов Sleep()?
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
EventManager: TEvent;
end;
TDoSomething = class(TThread)
public
procedure Execute; override;
procedure Delay;
end;
var
Form1: TForm1;
Something: TDoSomething;
implementation
{$R *.dfm}
procedure TDoSomething.Execute;
var
i: integer;
begin
FreeOnTerminate := true;
Form1.Timer1.Interval := 2000; // 2 second interval for a 2 second delay
Form1.EventManager := TEvent.Create;
for i := 1 to 10 do
begin
Delay;
writeln(TimeToStr(GetTime));
end;
FreeAndNil(Form1.EventManager);
end;
procedure TDoSomething.Delay;
begin
// Use a TTimer in concert with an instance of TEvent to implement a delay.
Form1.Timer1.Enabled := true;
Form1.EventManager.ResetEvent;
Form1.EventManager.WaitFor(INFINITE);
Form1.Timer1.Enabled := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Something := TDoSomething.Create;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Time is up. End the delay.
EventManager.SetEvent;
end;