Я сомневаюсь, что вам нужно иметь один поток для каждой задачи.Вероятно, было бы достаточно создать один таймер для каждой задачи.Если таймер срабатывает во время выполнения другой задачи, то вторая задача должна быть поставлена в очередь, но это не будет похоже на большую проблему.
Если вы собираетесь использовать Delphi TTimer
дляДля этого вам необходимо убедиться, что ваша служба имеет очередь сообщений и запускает цикл сообщений в этой очереди.Возможно, вы захотите запустить эту очередь сообщений в отдельном потоке, но если вы убедитесь, что объекты TTimer
созданы в этом потоке, чтобы они были связаны с правильной очередью сообщений.
Выспросите в комментариях, как запустить цикл сообщений в ветке.Следующий код должен быть достаточным:
repeat
try
Application.HandleMessage;
except
Application.HandleException(Application);
end;
until Terminated;//this is the Terminated property of the thread
Это даст вам все навороты цикла сообщений Delphi.Если вам нужен очень стандартный цикл обработки сообщений, вы можете использовать это:
procedure PerformThreadLoop;
var
Msg: TMsg;
begin
repeat
Try
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
WaitMessage;
Except
Application.HandleException(Self);
End;
until Terminated;//this is the Terminated property of the thread
end;
Если все, что вам нужно, это перекачивать WM_TIMER
сообщений, оба будут работать, но я лично был бы склонен перейти ко второму варианту,сырая версия Win32 API.