TestGame/addons/reactivex/scheduler/newthreadscheduler.gd

69 lines
2.1 KiB
GDScript3
Raw Normal View History

2024-12-27 21:00:07 +01:00
extends PeriodicScheduler
class_name NewThreadScheduler
## Creates an object that schedules each unit of work on a separate thread.
var thread_factory : Callable
func _init(thread_factory_ : Callable = GDRx.concur.default_thread_factory):
super._init()
self.thread_factory = thread_factory_
## Access to global singleton
static func singleton() -> NewThreadScheduler:
return GDRx.NewThreadScheduler_
## Schedule a new action for future execution
func schedule(action : Callable, state = null) -> DisposableBase:
var scheduler : EventLoopScheduler = EventLoopScheduler.new(self.thread_factory, true)
return CompositeDisposable.new([
scheduler.schedule(action, state),
Disposable.Cast(scheduler)
])
## Schedule a new action for future execution in [code]duetime[/code] seconds.
func schedule_relative(duetime, action : Callable, state = null) -> DisposableBase:
var scheduler : EventLoopScheduler = EventLoopScheduler.new(self.thread_factory, true)
return CompositeDisposable.new([
scheduler.schedule_relative(duetime, action, state),
Disposable.Cast(scheduler)
])
## Schedule a new action for future execution at [code]duetime[/code].
func schedule_absolute(duetime, action : Callable, state = null) -> DisposableBase:
var dt : float = duetime
return self.schedule_relative(dt - self.now(), action, state)
## Schedule a periodic action for repeated execution every time
## [code]period[/code] seconds have expired.
func schedule_periodic(
period : float,
action : Callable,
state = null) -> DisposableBase:
var seconds : RefValue = RefValue.Set(period)
var timeout : RefValue = RefValue.Set(seconds.v)
var _state : RefValue = RefValue.Set(state)
var disposed : ThreadingEvent = ThreadingEvent.new()
var run = func():
while true:
if timeout.v > 0.0:
disposed.wait(timeout.v)
if disposed.is_set():
return
var time : float = self.now()
_state.v = action.call(_state.v)
timeout.v = seconds.v - (self.now() - time)
var thread : StartableBase = self.thread_factory.call(run)
thread.start()
var dispose = func():
disposed.set_flag()
thread.wait_to_finish()
return Disposable.new(dispose)