Delphi应用程序中的定期任务

时间:2011-12-12 15:39:42

标签: multithreading delphi timer thread-safety scheduled-tasks

我正在开发一个应用程序,它应该在指定的时间间隔后在不同的MSSQL服务器中执行某些sql查询。我的想法是关于创建一个线程数组,并在每个线程运行计时器中运行任务。它是否真的需要为每个计时器制作每个线程,或者我应该为每个任务区分一个计时器(无论计时器将生成线程)?有关实施的任何想法吗?

非常感谢,伙计们!

1 个答案:

答案 0 :(得分:4)

我怀疑你每个任务需要一个线程。每个任务创建一个计时器可能就足够了。如果计时器在另一个任务正在运行时触发,那么第二个任务将不得不排队,但听起来不会是一个很大的问题。

如果您要使用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版本。