我正在开发一个应用程序,它应该在指定的时间间隔后在不同的MSSQL服务器中执行某些sql查询。我的想法是关于创建一个线程数组,并在每个线程运行计时器中运行任务。它是否真的需要为每个计时器制作每个线程,或者我应该为每个任务区分一个计时器(无论计时器将生成线程)?有关实施的任何想法吗?
非常感谢,伙计们!
答案 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版本。