Ich verwende seit längerem die folgende Timerprozedur mit gutem
Erfolg. Ich habe sie ein wenig als Demo zusammengefaßt.
Folgende Anforderungen waren gestellt:
- Einfügen in einen normalen Programmcode soll möglich sein
(wenn auch mit Umstellung von WaitWindowEvent auf WindowEvent)
- Mehrere Timerfunktionen sollen möglich sein
- threadlose Lösung ( ....wegen schlechtem Gefühl bei Threads,
eventuell ja unbegründet)
- Rücksetzung des Timers soll möglich sein
- Laufzeit auch über 13 Tage hinaus (wenn EllapsedMilliseconds
kollabiert). Manche schalten ihren PC ja nie aus.....
Code: Alles auswählen
;22_02_2005 by *** Team100 *** tested WinXP
;Universal Timer using milliseconds of the day as reference
;Easy to reset the timer by setting individual lasttime() flag to zero
;thread-less solution for timer events
Enumeration
#Window_0
EndEnumeration
Enumeration
#ScrollBar_0
#Button_0
#Radio_0
#Radio_1
#Text_0
#Button_1
#CheckBox_0
#CheckBox_1
EndEnumeration
Global FontID1
FontID1 = LoadFont(1, "Arial", 14)
Global FontID2
FontID2 = LoadFont(2, "Arial", 22)
Global FontID3
FontID3 = LoadFont(3, "Arial", 28)
Dim lasttime(100) ; argument: highest enumeration of gadgets
Procedure Open_Window_0()
If OpenWindow(#Window_0, 349, 133, 153, 285, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Timer Test")
If CreateGadgetList(WindowID())
ScrollBarGadget(#ScrollBar_0, 30, 50, 90, 30, 0, 1, 0)
ButtonGadget(#Button_0, 30, 230, 90, 40, "Press here", #PB_Button_Default)
OptionGadget(#Radio_0, 90, 180, 20, 30, "")
OptionGadget(#Radio_1, 40, 180, 20, 30, "")
TextGadget(#Text_0, 60, 130, 30, 40, "A")
SetGadgetFont(#Text_0, FontID3)
ButtonGadget(#Button_1, 50, 100, 50, 20, "", #PB_Button_Default | #PB_Button_Toggle)
CheckBoxGadget(#CheckBox_0, 50, 10, 30, 20, "")
CheckBoxGadget(#CheckBox_1, 90, 10, 20, 20, "")
EndIf
EndIf
EndProcedure
Procedure time_in_millisekunden()
GetSystemTime_ (system.SYSTEMTIME)
zeitinmillisekunden.l = system\wmilliseconds + (system\wsecond * 1000) + (system\wminute * 60 * 1000) + (system\whour * 1000 * 3600)
ProcedureReturn = zeitinmillisekunden
EndProcedure
Procedure event_timer(number, looptime, time_to_wait) ; use this procedure for multiple timer needs
If looptime - lasttime(number) > time_to_wait
lasttime(number) = looptime
ProcedureReturn = #True
ElseIf looptime < lasttime(number) ; for changing values at 12pm
lasttime(number) = looptime
EndIf
ProcedureReturn = #False
EndProcedure
Procedure event_timer_single(looptime, time_to_wait) ; use this procedure for a single timer
Static lasttime
If looptime - lasttime > time_to_wait
lasttime = looptime
ProcedureReturn = #True
ElseIf looptime < lasttime ; for changing values at 12pm
lasttime = looptime
EndIf
ProcedureReturn = #False
EndProcedure
;######### Main #####################
Open_Window_0()
Repeat
looptime = time_in_millisekunden() ; should be placed here for correct timer reset
Event = WindowEvent() ; not WaitWindowEvent
If Event = #PB_EventGadget
GadgetID = EventGadgetID()
If GadgetID = #Button_0
SetGadgetText(#Text_0, "#")
lasttime(#Text_0) = looptime ; reset timer #Text_0
; Elseif ...... your other events
EndIf
EndIf
;######## Timer events now: ###########################
If event_timer(#Text_0, looptime, 2000) = #True ; time in milliseconds
toggle_1!1
SetGadgetText(#Text_0, Str(toggle_1))
EndIf
If event_timer(#Radio_0, looptime, 333) = #True
toggle_2!1
SetGadgetState(#Radio_0, toggle_2)
SetGadgetState(#Radio_1, toggle_2!1)
EndIf
If event_timer(#Button_1, looptime, 500) = #True
toggle_3!1
SetGadgetState(#Button_1, toggle_3)
EndIf
If event_timer(#CheckBox_0, looptime, 150) = #True
toggle_4!1
SetGadgetState(#CheckBox_0, toggle_4)
EndIf
If event_timer(#CheckBox_1, looptime, 160) = #True
toggle_5!1
SetGadgetState(#CheckBox_1, toggle_5)
EndIf
If event_timer(#ScrollBar_0, looptime, 1000) = #True
toggle_6!1
SetGadgetState(#ScrollBar_0, toggle_6)
EndIf
Delay(10) ; don't forget
Until Event = #PB_EventCloseWindow
End
Eventuell könnte man ja noch was verbessern ?
@Skywalker
vielleicht hilfts ja weiter. Du würdest bei nur einer benötigten
Timerfunktion mit der vereinfachten Procedure (event_timer_single)
weiterkommen.
Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....