Async / waiting

Do stuff later without blocking

Summary

Published: Feb 18 2024 by manavortex Last documented edit: Feb 18 2024 by manavortex

Where to get cron

You can get Cron.lua from psiberx's cp2077-cet-kit on github. Add it to your sources, and then define it as a global:

-- don't overwrite it if it's already defined in the global scope. Or do, up to you.
Cron = Cron or require('External/Cron.lua')

How to use cron

Cron offers a bunch of functions for executing code later. The code you want to execute has to be inside a function (=> callback) and is passed among the arguments.

For periodically running functions, you need to include logic when to stop the execution.

Performance impact

To save processor load, it is best practice to define your callback outside of the function call. This can have a noticable performance impact, so you're gonna want to do this.

Good example:

local callback = function()
    -- do a little dance, make a little love
end
Cron.Every(0.1, callback)

The callback is defined once.

Bad example:

Cron.Every(0.1, function()
    -- do a little dance, make a little love
end)

The callback is defined every time cron runs.

Passing function arguments

To pass arguments to your callback function, you pass them as arguments to cron:

local callback = function(timer)
    timer.tick = timer.tick +1
    -- do a little dance, make a little love
end
Cron.Every(0.1, { tick = 1 }, callback)

Cron functions

Delay

Execute the callback after X seconds

local callback = function() --[[ do a little dance, make a little love ]] end
Cron.After(0.2, callback)

Timer

Executes a function every X seconds.

The function will run forever unless you stop it!

local callback = function(timer)
    timer.tick = timer.tick +1
    spdlog.info("Timer is running: " .. tostring(timer.tick))
    -- do a little dance, make a little love
    if timer.tick > 150 then
        Cron.Halt(timer)
    end
end

-- define outside of function scope to re-use this in Cron.Pause example below
local timerArg = { tick = 1 }

-- start timer
Cron.Every(0.2, timerArg, callback)

Pausing and resuming a timer

You can pause a timer by passing its reference to cron:

-- callback and timer have been defined in the example above
-- the timer is running

Cron.Pause(timerArg)
spdlog.info("Timer is paused after " .. tostring(timerArg.tick) .. " ticks")

-- wait 20 seconds, then resume our function
Cron.After(20, function () Cron.Resume(timerArg) end)

Last updated