multithreading - Delphi应用程序中的定期任务

标签 multithreading delphi timer thread-safety scheduled-tasks

我正在开发应在指定的时间间隔后在不同的MSSQL服务器中执行某些sql查询的应用程序。我的想法是关于创建一个线程数组,并在每个线程运行计时器中运行任务。是否确实需要为每个计时器分配每个线程,还是我应该为每个任务区分一个计时器(无论哪个计时器都会产生线程)?关于实现有什么想法吗?

非常感谢,伙计们!

最佳答案

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

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

关于multithreading - Delphi应用程序中的定期任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8476826/

相关文章:

c - Solaris 上的安德森队列锁

delphi - 仅在线程/计时器内执行一次命令但保持线程/计时器运行?

delphi - catch 启动应用程序

javascript - 在 JavaScript 上运行计时器

.net - 禁用 System.Threading.Timer 的最佳方法

java - 在 Java 中,如何测试对象的监视器是否使用传统的低级锁定机制锁定?

C# TCP 服务器等待 2 个客户端响应

c - 使用 POSIX 消息队列的单进程线程安全

delphi - 使用 RttiContext 在运行时查找类型

android - 如何在 Android 开发中停止线程中具有 sleep 方法的线程