55 lines
1.9 KiB
Lua
Executable File
55 lines
1.9 KiB
Lua
Executable File
--------------------------------------------------------------------------------
|
|
---------------------- ## ##### ##### ###### -----------------------
|
|
---------------------- ## ## ## ## ## ## ## -----------------------
|
|
---------------------- ## ## ## ## ## ###### -----------------------
|
|
---------------------- ## ## ## ## ## ## -----------------------
|
|
---------------------- ###### ##### ##### ## -----------------------
|
|
---------------------- -----------------------
|
|
----------------------- Lua Object-Oriented Programming ------------------------
|
|
--------------------------------------------------------------------------------
|
|
-- Project: LOOP Class Library --
|
|
-- Release: 2.3 beta --
|
|
-- Title : Timer for Triggering of Events at Regular Rates --
|
|
-- Author : Renato Maia <maia@inf.puc-rio.br> --
|
|
--------------------------------------------------------------------------------
|
|
|
|
local math = require "math"
|
|
local coroutine = require "coroutine"
|
|
local oo = require "loop.base"
|
|
|
|
module("loop.thread.Timer", oo.class)
|
|
|
|
function __init(class, self)
|
|
self = oo.rawnew(class, self)
|
|
self.thread = coroutine.create(function() return self:timer() end)
|
|
return self
|
|
end
|
|
|
|
function timer(self)
|
|
local scheduler = self.scheduler
|
|
if self.enabled then
|
|
local rate = self.rate
|
|
local next = scheduler:time() + rate
|
|
self:action()
|
|
local now = scheduler:time()
|
|
if now < next
|
|
then scheduler:suspend(next - now)
|
|
else scheduler:suspend(rate - math.fmod(now - next, rate))
|
|
end
|
|
else
|
|
scheduler:suspend()
|
|
end
|
|
return self:timer()
|
|
end
|
|
|
|
function enable(self)
|
|
if not self.enabled then
|
|
self.enabled = true
|
|
return self.scheduler:register(self.thread)
|
|
end
|
|
end
|
|
|
|
function disable(self)
|
|
self.enabled = nil
|
|
end
|