SoUI 0.5版本占坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.0 KiB

#ifndef YDWETPNewTimerPeriodicIncluded
#define YDWETPNewTimerPeriodicIncluded
#include "YDWEBase.j"
library YDWETimerPeriodic requires YDWEBase
globals
private constant timer TIMER = CreateTimer()
private constant real INTER = 0.01
endglobals
globals
private integer array Structs
private integer Total = 0
private integer Index = 0
endglobals
private struct TimerData
trigger trg = null
real dur = 0.
real inter = 0.
boolean perio = false
boolean pause = false
endstruct
private function Spin takes nothing returns nothing
local TimerData data = 0
local integer inst = 0
loop
exitwhen inst == Total
set data = inst:Structs
set data.dur = data.dur + INTER
if data.dur == data.inter or data.dur > data.inter then
set Index = integer(data)
if not data.pause then
call TriggerExecute(data.trg)
endif
if data.perio then
set data.dur = 0.
else
set data.trg = null
call data.destroy()
set Total = Total - 1
set inst:Structs = Total:Structs
set inst = inst - 1
endif
set Index = 0
endif
set inst = inst + 1
endloop
if Total == 0 then
call PauseTimer(TIMER)
endif
endfunction
// 获取计时器:逝去时间、剩余时间、设置的时间
function YDWE_TP_GetElapsedTime takes TimerData data returns real
return data.dur
endfunction
function YDWE_TP_GetRemainingTime takes TimerData data returns real
return data.inter - data.dur
endfunction
function YDWE_TP_GetTimeout takes TimerData data returns real
return data.inter
endfunction
function YDWE_TP_PauseTimerPeriodic takes TimerData data returns nothing
set data.perio = false
set data.pause = true
set data.inter = 0.
endfunction
function YDWE_TP_SetTimeInterval takes TimerData data, real interval returns nothing
if data.perio then
set data.inter = interval
endif
endfunction
function YDWE_TP_GetExpiredTimerIndex takes nothing returns TimerData
return Index
endfunction
function YDWE_TP_NewTimerPeriodic takes real timeout, boolean periodic, trigger trig returns TimerData
local TimerData data = TimerData.create()
set data.inter = timeout
set data.perio = periodic
set data.trg = trig
set Total:Structs = data
set Total = Total + 1
if Total - 1 == 0 then
call TimerStart(TIMER, INTER, true, function Spin)
endif
//call BJDebugMsg(I2S(Total))
return data
endfunction
endlibrary
#endif /// YDWETPNewTimerPeriodicIncluded