{ interval_task -- minimal example: schedule a 5-second interval task and let it run for ~12 seconds. Build: bash build.sh /opt/fpcup/fpc/bin/x86_64-linux/fpc -O2 -Sh \ -Fusrc -Fu../fpc-db/src -Fu../fpc-events/src \ -FUbuild -FEbuild -obuild/interval_task examples/interval_task.pas Run: ./build/interval_task } program interval_task; {$mode objfpc}{$H+} uses {$IFDEF UNIX}cthreads,{$ENDIF} Classes, SysUtils, fpjson, DateUtils, database.types, database.pool, log.types, cron.types, cron.runner; type THost = class public procedure RunTask(const APluginName, ATaskName: string); procedure Log(Level: TLogLevel; const Category, Msg: string); end; procedure THost.RunTask(const APluginName, ATaskName: string); begin Writeln(FormatDateTime('hh:nn:ss', Now), ' -- ', APluginName, '/', ATaskName, ' fired'); end; procedure THost.Log(Level: TLogLevel; const Category, Msg: string); begin Writeln('[', LogLevelChar(Level), '] ', Category, ': ', Msg); end; var Pool: TDBPool; Sched: TCron; Host: THost; Params: TJSONObject; DBFile: string; begin DBFile := '/tmp/fpcsched_example_' + IntToStr(GetProcessID) + '.sqlite3'; if FileExists(DBFile) then DeleteFile(DBFile); Pool := TDBPool.Create; Pool.Init(dbSQLite, DBFile); Host := THost.Create; try Sched := TCron.Create(Pool, @Host.RunTask, nil, @Host.Log); try Params := TJSONObject.Create; try Params.Add('nr', FormatDateTime('yyyy-mm-dd hh:nn:ss', LocalTimeToUniversal(Now) - 1)); Pool.ExecSQL( 'INSERT INTO system_scheduler ' + '(task_name, plugin_name, schedule_type, interval_seconds, ' + ' enabled, next_run, description) VALUES ' + '(''heartbeat'', ''demo'', ''interval'', 5, 1, :nr, ''demo'')', Params); finally Params.Free; end; Sched.RefreshTasks; Sched.Start; Sleep(12000); Sched.Terminate; finally Sched.Free; end; finally Host.Free; Pool.Free; DeleteFile(DBFile); end; end.