Files
w3dhub_linux_launcher/lib/background_worker.rb

82 lines
1.4 KiB
Ruby

class W3DHub
class BackgroundWorker
@@instance = nil
@@alive = false
def self.create
raise "BackgroundWorker instance already exists!" if @@instance
@@alive = true
@@instance = self.new
Async do
@@instance.handle_jobs
end
end
def self.instance
@@instance
end
def self.alive?
@@alive
end
def self.shutdown!
@@alive = false
end
def self.job(job, callback)
@@instance.add_job(Job.new(job, callback))
end
def self.foreground_job(job, callback)
@@instance.add_job(Job.new(job, callback, true))
end
def initialize
@jobs = []
end
def handle_jobs
while BackgroundWorker.alive?
job = @jobs.shift
begin
job&.do
rescue => e
pp e
end
sleep 0.1
end
end
def add_job(job)
@jobs << job
end
class Job
def initialize(job, callback, deliver_to_queue = false)
@job = job
@callback = callback
@deliver_to_queue = deliver_to_queue
end
def do
result = @job.call
deliver(result)
end
def deliver(result)
if @deliver_to_queue
Store.main_thread_queue << -> { @callback.call(result) }
else
@callback.call(result)
end
end
end
end
end