96 lines
3.0 KiB
GDScript
96 lines
3.0 KiB
GDScript
extends Scheduler
|
|
class_name TrampolineScheduler
|
|
|
|
## Represents an object that schedules units of work on the [Trampoline].
|
|
##
|
|
## You should never schedule timeouts using the [TrampolineScheduler], as
|
|
## it will block the thread while waiting.
|
|
##
|
|
## Each instance has its own trampoline (and queue), and you can schedule work
|
|
## on it from different threads. Beware though, that the first thread to call
|
|
## a [code]schedule[/code] method while the trampoline is idle will then remain occupied
|
|
## until the queue is empty.
|
|
|
|
var _tramp : Trampoline
|
|
|
|
func _init():
|
|
self._tramp = Trampoline.new()
|
|
|
|
## Returns the [Trampoline]
|
|
func get_trampoline() -> Trampoline:
|
|
return self._tramp
|
|
|
|
## Schedules an action to be executed.
|
|
## [br]
|
|
## [b]Args:[/b]
|
|
## [br]
|
|
## [code]action[/code] Action to be executed.
|
|
## [br]
|
|
## [code]state[/code] [Optional] state to be given to the action function.
|
|
## [br][br]
|
|
## [b]Returns:[/b]
|
|
## [br]
|
|
## The disposable object used to cancel the scheduled action
|
|
## (best effort).
|
|
func schedule(action : Callable, state = null) -> DisposableBase:
|
|
return self.schedule_absolute(self.now(), action, state)
|
|
|
|
## Schedules an action to be executed after duetime.
|
|
## [br]
|
|
## [b]Args:[/b]
|
|
## [br]
|
|
## [code]duetime[/code] Relative time after which to execute the action.
|
|
## [br]
|
|
## [code]action[/code] Action to be executed.
|
|
## [br]
|
|
## [code]state[/code] [Optional] state to be given to the action function.
|
|
## [br][br]
|
|
##
|
|
## [b]Returns:[/b]
|
|
## [br]
|
|
## The disposable object used to cancel the scheduled action
|
|
## (best effort).
|
|
func schedule_relative(duetime, action : Callable, state = null) -> DisposableBase:
|
|
duetime = max(DELTA_ZERO, duetime)
|
|
return self.schedule_absolute(self.now() + duetime, action, state)
|
|
|
|
## Schedules an action to be executed at duetime.
|
|
## [br]
|
|
## [b]Args:[/b]
|
|
## [br]
|
|
## [code]duetime[/code] Absolute time at which to execute the action.
|
|
## [br]
|
|
## [code]action[/code] Action to be executed.
|
|
## [br]
|
|
## [code]state[/code] [Optional] state to be given to the action function.
|
|
## [br][br]
|
|
##
|
|
## [b]Returns:[/b]
|
|
## [br]
|
|
## The disposable object used to cancel the scheduled action
|
|
## (best effort).
|
|
func schedule_absolute(duetime, action : Callable, state = null) -> DisposableBase:
|
|
var dt : float = duetime
|
|
if dt > self.now():
|
|
push_warning("Do not schedule blocking work!")
|
|
var item : ScheduledItem = ScheduledItem.new(self, dt, state, action)
|
|
|
|
self.get_trampoline().run(item)
|
|
|
|
return item.disposable
|
|
|
|
## Test if scheduling is required.
|
|
##
|
|
## Gets a value indicating whether the caller must call a
|
|
## schedule method. If the [Trampoline] is active, then it returns
|
|
## [code]false[/code]; otherwise, if the trampoline is not active, then it
|
|
## returns [code]true[/code].
|
|
func schedule_required() -> bool:
|
|
return self.get_trampoline().idle()
|
|
|
|
## Method for testing the [TrampolineScheduler].
|
|
func ensure_trampoline(action : Callable):
|
|
if self.schedule_required():
|
|
return self.schedule(action)
|
|
return action.call(self, null)
|