
Code: Select all
;*****************************************************************************
;*
;* July-August 2014 PurePunch contest
;* PureBasic 5.22
;* 50 lines of 80 chars, 2 months delay
;*
;* Name : Timer (Not really a good name)
;* Author : Bananenfreak
;* Date : 29.07.2014
;* Notes : You can add your own Timerevents in Enumeration "Timerevents". Lines 44 to 59 is how about using this Timer.
;* event2 is used for better event1 description.
;*****************************************************************************
EnableExplicit
Define.i quit
Enumeration Timerevents
#quit = 10000
EndEnumeration
DeclareModule Timer:Structure timeList:dur.i:start.i:event1.i:event2.i
EndStructure:Structure timeEvent:handle.i:event1.i:event2.i:EndStructure
Global NewList times.timeList():Global NewList timeEvent.timeEvent()
Global.i mutexEvent,mutexTime:Declare.i CreateTimer(para.i):Declare ClearTimer()
Declare.i DeleteTimer(handle.i):Declare.i AddTime(dur.i,start.i,event1.i,
event2.i=0):EndDeclareModule:Module Timer:Global.i init=0
Procedure.i AddTime(dur,start,event1,event2=0):LockMutex(mutexTime)
AddElement(times()):times()\dur=dur:times()\start=start:times()\event1=event1
times()\event2=event2:ProcedureReturn @times():EndProcedure
Procedure ClearTimer():LockMutex(mutexTime):ClearList(times())
UnlockMutex(mutexTime):EndProcedure:Procedure.i DeleteTimer(handle)
LockMutex(mutexTime):If Not ListSize(times())=0:PopListPosition(times())
ChangeCurrentElement(times(),handle):DeleteElement(times())
PushListPosition(times()):UnlockMutex(mutexTime):ProcedureReturn 1:Else
UnlockMutex(mutexTime):ProcedureReturn 0:EndIf:EndProcedure:Procedure Timer(par)
Protected.i time:Repeat:LockMutex(mutexTime):ForEach times()
time=ElapsedMilliseconds():If time>=(times()\start+times()\dur)
LockMutex(mutexEvent):AddElement(timeEvent()):timeEvent()\event1=times()\event1
timeEvent()\event2=times()\event2:timeEvent()\handle=@times()
UnlockMutex(mutexEvent):LockMutex(mutexTime):DeleteElement(times())
UnlockMutex(mutexTime):EndIf:Next times():UnlockMutex(mutexTime)
If TryLockMutex(mutexTime):If ListSize(times())<10:Delay(10):EndIf
UnlockMutex(mutexTime):EndIf:ForEver:EndProcedure
Procedure.i CreateTimer(para):If Not init:mutexEvent=CreateMutex()
mutexTime=CreateMutex():init=#True:ProcedureReturn CreateThread(@Timer(),
para):Else:ProcedureReturn 0:EndIf:EndProcedure:EndModule
If Timer::CreateTimer(0)
Timer::AddTime(2000, ElapsedMilliseconds(), #quit)
UnlockMutex(Timer::mutexTime)
Repeat
Debug "------------"
If TryLockMutex(Timer::mutexEvent)
While Not ListSize(Timer::timeEvent()) = 0
If Timer::timeEvent()\event1 = #quit
quit = #True
DeleteElement(Timer::timeEvent())
EndIf
Wend
UnlockMutex(Timer::mutexEvent)
EndIf
Until quit = #True
Else:MessageRequester("Error", "Timer is already created."):EndIf:End