在一段时间内更新数据库中的数据

时间:2018-02-01 19:14:02

标签: multithreading stored-procedures lazarus freepascal

我每次更新数据库中的某些数据时都有问题,即每分钟。 所以我使用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程序中没有得到所需的更新频率... 所以我坚持这个事情,如何在特定时间执行程序每个程序都不同......有谁可以帮我解决这个问题?

1 个答案:

答案 0 :(得分:0)

使用TTimer和状态机。在每个计时器事件中,检查是否需要执行某些操作,如果需要,请启动状态机。

低分辨率计时器例程也可以为调度程序提供信息。 Jedi JCL有一个例子,但恕我直言,它有点笨拙。