Задача - хотя бы 60 (а лучше 100) раз в секунду что-то там делать. Services.DoLater как оказалось очень слоупочна - максимум получается 16 раз в секунду.
Тестировал так:
MODULE BackgroundAction;
IMPORT StdLog, Services, Kernel;
TYPE
Action = POINTER TO RECORD (Services.Action) END;
VAR
count : INTEGER;
begin : LONGINT;
action : Action;
PROCEDURE (a: Action) Do;
BEGIN
INC(count);
IF count = 1000 THEN
StdLog.Real((Kernel.Time() - begin)/1000);
StdLog.Ln;
StdLog.Real(1000/((Kernel.Time() - begin)/1000));
StdLog.Ln;
ELSE
Services.DoLater(a,Services.now);
END
END Do;
PROCEDURE Start*;
BEGIN
count := 0;
NEW(action);
begin := Kernel.Time();
Services.DoLater(action,Services.now);
END Start;
BEGIN
END BackgroundAction.