Seite 1 von 1
Hilfe bei Timer/Countdown benötigt
Verfasst: 06.10.2005 16:05
von hiltwin
Ich habe folgendes Problem, für das ich eine Lösungshilfe benötige:
Ich habe einen Countdown erstellt, der über die folgenden drei Buttongadgets angesteuert werden soll: "Start" "Stop" und "Reset".
Dazu wird bei Drücken des Buttons "Start" folgendes ausgeführt:
Code: Alles auswählen
CountDown=500
Repeat
WindowEvent()
CountDown - 1 :
SetGadgetText(8,FormatDate("%ii:%ss",CountDown))
Until CountDown = 0 Or EventGadgetID()=#Button_Stop
Debug "GadgetID: #Button_Stop"
DisableGadget(0,1)
DisableGadget(1,0)
Ich würde jetzt gerne nach der WindowEvent()-Abfrage mit
während die Repeat-Schleife läuft, den Zähler zurücksetzen. Allerdings bleibt ständig EventGadgetID()=#Button_Resize, so dass eine Endlosschleife vorliegt.
Gibt es einen Befehl oder einen Zugriff über Windows-API, bei der ich "EventGadgetID()" so modifizieren kann, dass dort kein Wert mehr hinterlegt ist oder alternativ EventGadgetID()=#Button_Start?
Grüsse
Hiltwin
Edit by Kiffi: Code-Tags gesetzt
Verfasst: 06.10.2005 16:21
von bobobo
mach das mal so in der Art
Code: Alles auswählen
Global time.l
time=500
Enumeration
#Window_0
#Button_0
#Button_1
#Button_2
#String_0
EndEnumeration
Procedure updateTimer()
Repeat
SetGadgetText(#String_0,Str(time))
Time-1
Delay(500)
ForEver
EndProcedure
If OpenWindow(#Window_0, 216, 0, 600, 300, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
If CreateGadgetList(WindowID())
ButtonGadget(#Button_0, 45, 50, 85, 20, "START")
ButtonGadget(#Button_1, 155, 55, 120, 30, "STOP")
ButtonGadget(#Button_2, 310, 60, 95, 35, "RESET")
StringGadget(#String_0, 130, 15, 195, 25, "500")
EndIf
EndIf
DisableGadget(#Button_1,1)
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadgetID() ; Is it a gadget event?
EventType = EventType() ; The event type
;You can place code here, and use the result as parameters for the procedures
If Event = #PB_EventGadget
If GadgetID = #Button_0
tid=CreateThread(@updatetimer(),0)
Debug "Knopf0"
;DisableGadget(#Button_2,1)
DisableGadget(#Button_1,0)
DisableGadget(#Button_0,1)
ElseIf GadgetID = #Button_1
KillThread(tid)
;DisableGadget(#Button_2,0)
DisableGadget(#Button_1,1)
DisableGadget(#Button_0,0)
ElseIf GadgetID = #Button_2
;: KillThread(tid) :EndIf
time=500
SetGadgetText(#String_0,Str(time))
ElseIf GadgetID = #String_0
EndIf
EndIf
Until Event = #PB_Event_CloseWindow ; End of the event loop
End
geänderte Version .. "life"-funktionierender ResetKnopf
das ist leider nicht das, was ich benötige ...
Verfasst: 06.10.2005 16:40
von hiltwin
... denn wenn ich bei deiner lösung reset klicke, dann geht der zähler auf 500 zurück und zählt erst dann wieder runter, wenn ich erneut start gedrückt habe.
(ich hab deine disables mal alle auf 0 gesetzt ;o) )
was ich jedoch benötige ist eine lösung, bei der ich bei laufendem wie stehendem countdown den zähler wieder auf die anfangszahl zurückstellen kann.
bsp:
beim basketball wechselt der ballbesitz und die angriffszeit wird damit auf 20 sekunden (waren doch 20 sek. oder? ;o) ) zurückgestellt, obwohl die gesamtzeit weiterläuft. fällt ein korb oder ist seitenwechsel steht die gesamtzeit und die angriffszeit soll auch wieder auf null gesetzt werden.
dementsprechend benötige ich etwas, womit ich im repeatteil EventGadgetID() manipulieren kann oder irgendetwas alternatives ...
trotzdem vielen dank für deine mühe ...
Verfasst: 06.10.2005 18:00
von hardfalcon
Kleiner Tipp am Rande: einen präzisen Counter programmiert man nicht mit Delay(), sondern mit dem Date() (wenn Sekundengenauigkeit ausreicht) oder mit ElapsedMilliseconds() (aufpassen, wenn die Timervariable "überläuft"!!!). Denn bei Delay() addiert sich zur Countdownzeit, wodurch der Countdown ungenau wird. Ausserdem ist bei jedem Rechner die Rechengeschwindigkeit anders, sodass der Counter unterschiedlich lange zum Runterzählen braucht, je nachdem, auf welchem Rechner er läuft.
Verfasst: 06.10.2005 19:18
von hiltwin
Problem ist mittlerweile gelöst (im APi-Forum steht die Antwort)
@ Hardfalcon:
Vielen Dank für den Tipp, allerdings benötige ich in der Tat mehr als Sekundengenauigkeit. Aber der Hinweis mit dem Variablenüberlauf ist gut. Habe allerdings schon mit der Maximalzeit getestet und die Zeit funktioniert ohne Probleme.
Und nen Delay hab ich auch nicht drin, arbeite mit Time = GetTickCount_().
BTW: Kann mir jemand sagen, warum ich bei
StartTimer(0,15,@Timer_())
immer die Fehlermeldung bekomme, StartTimer ist weder Funktion, Array noch eine Linked List ...
Frdl. Gruss
Hiltwin