Периодические задания в приложении Delphi - PullRequest
1 голос
/ 12 декабря 2011

Я занимаюсь разработкой приложения, которое должно выполнять определенные SQL-запросы на разных серверах MSSQL через определенные промежутки времени.Мои мысли о том, чтобы создать массив потоков и в каждом потоке запустить таймер, в котором будет запускаться задача.Действительно ли нужно создавать каждый поток для каждого таймера, или я должен просто выделить один таймер для каждой задачи (какой бы таймер не создавал поток)?Есть мысли о реализации?

Большое спасибо, ребята!

1 Ответ

4 голосов
/ 12 декабря 2011

Я сомневаюсь, что вам нужно иметь один поток для каждой задачи.Вероятно, было бы достаточно создать один таймер для каждой задачи.Если таймер срабатывает во время выполнения другой задачи, то вторая задача должна быть поставлена ​​в очередь, но это не будет похоже на большую проблему.

Если вы собираетесь использовать 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.

...