gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:34:31 25 4
gpt4 key购买 nike

我正在开发应在指定的时间间隔后在不同的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com