我每次更新数据库中的某些数据时都有问题,即每分钟。 所以我使用Lazarus作为编程语言并创建了linux守护进程应用程序,应用程序包含一个线程,其中我拥有从数据库获取数据所涉及的所有逻辑
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, daemonapp, Unit1, math;
....
TProcThread = class(TThread)
procedure Execute; override;
procedure UpdVars;
procedure UpdLogs;
end;
TDaemon = class(TCustomDaemon)
private
FThread: TProcThread;
procedure ThreadStopped (Sender: TObject);
public
function Start: Boolean; override;
function Stop: Boolean; override;
function Execute: Boolean; override;
function Install: Boolean; override;
function UnInstall: Boolean; override;
end;
procedure TProcThread.UpdVars;
begin
// update database
end;
procedure TProcThread.UpdLogs;
begin
// update database
end;
procedure TProcThread.Execute;
begin
repeat
while not (Query.EOF) do begin
//////
//doing stufff
//////
sleep(1000);
UpdVars;
end;
sleep(60000); // <= if I put this sleep than UpdVars don't update every second, but it updates 1sec + 60000 seconds
UpdLogs;
until Terminated;
end;
constructor TJPDaemonMapper.Create(AOwner: TComponent);
var
d: TDaemonDef;
begin
inherited Create(AOwner);
d:= DaemonDefs.Add as TDaemonDef;
d.DisplayName:= 'MyService';
d.Name:= 'myservice';
d.DaemonClassName:= 'TDaemon';
d.WinBindings.ServiceType:= stWin32;
end;
{$R *.res}
begin
Application.Title:='MyService';
RegisterDaemonClass(TDaemon);
RegisterDaemonMapper(TJPDaemonMapper);
DataModule1:= TDataModule1.Create(nil);
Application.Run;
end.
我想每分钟更新一次我的日志表,我也有一个程序UpdVars
,它也需要每秒执行一次,这是我在执行此程序后放入sleep(1000)
所得到的从数据库获取数据的主while
循环。但是如果我在日志更新程序之前进行第二次睡眠,我在UpdVars
程序中没有得到所需的更新频率...
所以我坚持这个事情,如何在特定时间执行程序每个程序都不同......有谁可以帮我解决这个问题?
答案 0 :(得分:0)
使用TTimer和状态机。在每个计时器事件中,检查是否需要执行某些操作,如果需要,请启动状态机。
低分辨率计时器例程也可以为调度程序提供信息。 Jedi JCL有一个例子,但恕我直言,它有点笨拙。