Extended mode can run finite CPU and read-only file work on an isolated background thread. Jobs are independent of windows, graphics, and the GUI event queue. The main program polls or waits, then explicitly transfers a serialized Bank result. For a practical introduction and game-loop patterns, see Using Background Jobs.
Worker Function BuildData(inputBank)
outputBank = CreateBank(4)
PokeInt outputBank, 0, PeekInt(inputBank, 0) * 2
Return outputBank
End Function
job = StartJob(BuildData, inputBank, revision)
A public entry accepts one Integer slot containing its input Bank and returns one Integer slot containing a worker-created Bank. StartJob copies the input before returning, so the caller may immediately modify, resize, or free its source. Passing zero supplies an empty read-only Bank. Ordinary code cannot call a Worker Function directly.
Worker locals may use Int, Float, Long, Double, String, fixed arrays, local Types, Lists, Maps, Sets, Queues, Stacks, Banks, deterministic math and random commands, and read-only files/directories/streams. Worker helpers must also be declared with Worker Function.
Workers cannot access main globals or dynamic arrays, ordinary Functions or Methods, engine/world/entity/graphics, physics, audio, input, GUI, timers, sockets, multiplayer services, UserLibs, DLL calls, writable files, process environment mutation, DATA/READ/Restore, Gosub, or nested Jobs and waits. A runtime command is main-only unless the runtime explicitly classifies it as worker-safe.
Cancellation is cooperative. The compiler inserts safe points at worker and helper entry and on every generated loop backedge. JobCancelled() remains available for an algorithm that wants a graceful branch. SetJobProgress publishes advisory done/total/stage snapshots.
Use PollJob in a game loop. WaitJob and WaitAnyJob use synchronization but do not render, pump GUI events, or invoke generated callbacks. Compare JobTag with the application's current revision before applying a result. TakeJobResult transfers a successful Bank once; FreeJob releases the handle and any unclaimed data.
JOB_QUEUED = 1 JOB_RUNNING = 2 JOB_SUCCEEDED = 3 JOB_FAILED = 4 JOB_CANCELLED = 5
Failures remain within the Job. JobError and its file, line, and function queries return bounded main-thread copies. Worker debug hooks never open the GUI debugger from the background thread.
Open the complete Worker Function example.
Worker Function DoubleValue(inputBank)
outputBank = CreateBank(4)
PokeInt outputBank, 0, PeekInt(inputBank, 0) * 2
SetJobProgress 1L, 1L, "Complete"
Return outputBank
End Function
inputBank = CreateBank(4)
PokeInt inputBank, 0, 21
job = StartJob(DoubleValue, inputBank, 1L)
FreeBank inputBank
While Not JobFinished(job)
Delay 1
Wend
If JobState(job) <> JOB_SUCCEEDED Then RuntimeError JobError(job)
resultBank = TakeJobResult(job)
If PeekInt(resultBank, 0) <> 42 Then RuntimeError "Unexpected result"
FreeBank resultBank
FreeJob job
End