В OmniThreadLibrary , вы должны сделать:
uses
OtlTask,
OtlTaskControl;
type
TTimedTask = class(TOmniWorker)
public
procedure Timer1;
end;
var
FTask: IOmniTaskControl;
procedure StartTaskClick;
begin
FTask := CreateTask(TTimedTask.Create())
.SetTimer(1, 5*1000, @TTimedTask.Timer1)
.Run;
end;
procedure StopTaskClick;
begin
FTask.Terminate;
FTask := nil;
end;
procedure TTimedTask.Timer1;
begin
// this is triggered every 5 seconds
end;
Что касается сна в Execute - это зависит от того, как вы это делаете. Если вы используете Sleep, то это может быть не очень разумно (например, потому что это предотвратит остановку потока во время сна). Спать с WaitForSingleObject нормально.
Пример TThread и WaitForSingleObject:
type
TTimedThread = class(TThread)
public
procedure Execute; override;
end;
var
FStopThread: THandle;
FThread: TTimedThread;
procedure StartTaskClick(Sender: TObject);
begin
FStopThread := CreateEvent(nil, false, false, nil);
FThread := TTimedThread.Create;
end;
procedure StopTaskClick(Sender: TObject);
begin
SetEvent(FStopThread);
FThread.Terminate;
FThread.Free;
CloseHandle(FStopThread);
end;
{ TTimedThread }
procedure TTimedThread.Execute;
begin
while WaitForSingleObject(Form71.FStopThread, 5*1000) = WAIT_TIMEOUT do begin
// this is triggered every 5 seconds
end;
end;
Реализация таймера OTL аналогична приведенному выше коду TThread. Таймеры OTL хранятся в списке приоритетов (в основном таймеры сортируются по времени «следующего появления»), а внутренний диспетчер MsgWaitForMultipleObjects в TOmniWorker указывает соответствующее значение тайм-аута для таймера с самым высоким приоритетом.