SRL Archive - SRL Snippets

TTask


rj

2014-08-27 10:35:55

type
TTask = record
execute:procedure;
conditional:function:boolean;
active:boolean;
executeEvery, lastTime:integer;
stopAfter, count:int64;
taskName:string;
end;

TTaskArray = array of TTask;

procedure TTaskArray.addTask(name:string;exec:procedure;condition:function:boolean;execEvery:integer;stop:int64);
var
L:integer;
begin
L := length(self);
setLength(self, L + 1);
with self[L] do
begin
execute := @exec;
conditional := @condition;
active := true;
executeEvery := execEvery;
stopAfter := stop;
lastTime := getSystemTime();
taskName := name;
end;
end;

procedure TTaskArray.addTask(name:string;exec:procedure; exEvery:integer);overload;
begin
self.addTask(name, @exec, nil, exEvery, 9223372036854775806);
end;

procedure TTask.executeProc();
begin
if (self.active = false) then
exit();
if ((getSystemTime - self.lastTime) > self.executeEvery) then
begin
inc(self.count);
if (self.count > self.stopAfter) then
begin
self.active := false;
exit();
end else
begin
if (@self.conditional <> nil) then
begin
if self.conditional() then
self.execute();
end else
self.execute();
end;
self.lastTime := getSystemTime();
end;
end;

procedure TTaskArray.executeTasks();
var
i:integer;
begin
for i := 0 to high(self) do
self[i].executeProc();
end;

procedure TTaskArray.deleteTask(index:integer);
begin
delete(self, index, 1);
end;

procedure TTaskArray.deleteTask(name:string);overload;
var
i:integer;
begin
for i := 0 to high(self) do
if (name = self[i].taskName) then
begin
self.deleteTask(i);
break;
end;
end;

Executes procedures after a certain amount of time, just call TTaskArray.executeTasks();

One example of how I used it was on my SS fighter I needed to check the players level every minute to see if they leveled up, check if prayer was activated every 30 seconds (if not then drink activate), and other stuff

example

myTask.addTask('Check prayers', @checkPrayers, 30000);
myTask.addTask('Progress report', @progress, 2000);
myTask.addtask('Drink potion', @drinkPotion, @statsLow, 15000, 15);

Credits to slacky for delete record info

Brandon

2014-08-27 11:48:48

I don't see the point in this.. You still have to call "ExecuteTask" synchronously anyway, so you might as well just call the function directly..

rj

2014-08-27 12:07:43

From: Brandon
I don't see the point in this.. You still have to call "ExecuteTask" synchronously anyway, so you might as well just call the function directly..


It's for timed functions like checking prayer, levels, etc etc that you have to do every few mins

Unless you want to make a variable for each time

Syntax

2014-08-31 03:10:19

Bookmarked for later use, thanks Robert!