Seite 1 von 1

Timer in PureBasic

Verfasst: 28.09.2004 22:27
von Quaxi
Hello again :-)
Also folgendes. Ich muss in meiner Anwendung alle x Sekunden eine Variable um eins erhöhen. Da aber meine Anwendung im Hintergrund weiterlaufen muss fäält der sleep befehl schon mal weg.
Und einfach die Systemzeit auslesen und ständig vergleiche geht auch net weil die nicht auf Millisekunden genau ist.
Wie kann man also einen Time in PurBasic verwenden ala Visual Basic oder ähnlich? Währe für hilfe sehr dankbar!

Verfasst: 28.09.2004 22:37
von Deeem2031

Verfasst: 28.09.2004 22:40
von NicTheQuick
Ich würde das mal wieder so machen:

Code: Alles auswählen

Global DelayTime.l
DelayTime = 100

Count.l = 0

Procedure CheckTimer()
  Static Time.l
  If Time = 0
    Time = ElapsedMilliseconds() + DelayTime
    ProcedureReturn #True
  EndIf
  
  If Time < ElapsedMilliseconds()
    Time + DelayTime
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

If OpenWindow(0, 0, 0, 200, 20, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Timer-Test")
  If CreateGadgetList(WindowID(0))
    TextGadget(0, 0, 0, 200, 20, "Timer: " + Str(Count), #PB_Text_Border)
    Repeat
      EventID = WindowEvent()
      Select EventID
        Case #PB_EventCloseWindow
          Break
        Case 0
          Delay(1)
      EndSelect
      
      If CheckTimer()
        Count + 1
        SetGadgetText(0, "Timer: " + Str(Count))
      EndIf
    ForEver
  EndIf
EndIf
Aber ich schätze mal, andere Leute haben da bessere Ideen mit richtigen assynchronen Timer-Threads.

Der Vorteil von meiner Methode ist aber auch noch, dass der Timer verlorene Zeit wieder aufholt. Das heißt, wenn man z.B. das Fenster die ganze Zeit verschiebt, indem man die Maus ständig auf der Titelbar gedrückt hält, bleibt die Zeit stehen. Wenn man jetzt aber wieder loslässt, läuft der Timer an die Stelle, wo er in der Zeit hätte hinlaufen können.

Das einzigste Problem ist wohl, dass der Timer zwar in der Gesamtlaufzeit des Programms durchschnittlich 100% genau arbeitet, aber zwischen den einzelnen Ticks Ungenauigkeiten vorkommen können.

Verfasst: 29.09.2004 06:32
von Danilo
Siehe StartTimer() in PureTools.

Verfasst: 29.09.2004 15:44
von Team100
..... dazu hätt ich eine Frage: Weis jemand was ElapsedMilliseconds()
macht wenn die gezählten Millisekunden die Grenzen der Longs
erreichen??? Nach 24 Tagen und 20 Stunden ist es soweit ( wenn ich mich
nicht verrechnet habe).

---> wird wieder bei 0 angefangen zu zählen ??

---> ElapsedMilliseconds () verbleibt bei 2147483647 und zählt nicht mehr weiter ?

---> oder verhält sich ElapsedMilliseconds () wie eine long variable
und wechselt seinen Wert beim Überschreiten kommentarlos ins negative ?

Code: Alles auswählen

  

; ***** Verhalten  der Werte von Longvariablen bei Bereichüberschreitung *****

lang.l = 2147483647        ; Bereichsgrenze
Debug lang                  ; ergibt     2147483647; logisch, was sonst
lang = lang + 1
Debug lang                  ; ergibt   -2147483648 ; springt ohne Fehlermeldung ins Negative
lang = lang + 1
Debug lang                  ; ergibt   -2147483647;  usw.
---> sonstige Möglichkeiten : Programm stürzt ab, PC explodiert ,
Festplatte wird gelöscht ........ :freak:

Irgendetwas wird passieren, in jedem Falle würden alle bisherigen Codeschnippsel mit
ElapsedMilliseconds() Ihre Funktion einstellen......

Sicher ist es so, daß man vordergründig meint, daß der PC
ohnehin meist regelmäßig abgeschaltet wird. Oft ist das nicht
der Fall : Ich kenne jede Menge Büros, wo die PCs immer
an bleiben wegen der umständlichen Hochfahrprozedur mit Laden
übers Netz etc. , ebenso natürlich Server oder Spielautomaten in einer Wirtschaft etc.

Dumm auch wenn man bei jemandem wichtigen seine Progs vorführt und der dortige PC
schon viele Tage eingeschaltet war .....

Hat jemand auch Erfahrung wie sich ElapsedMilliseconds() in den
diversen Energiesparzuständen verhält ?

Cu von Team100

Verfasst: 29.09.2004 15:56
von NicTheQuick
Ausprobieren... /:->

///Edit:
Aus der MSDN von [c]GetTickCount_()[/c], das sicherlich genauso funktioniert wie [c]ElapsedMilliseconds()[/c]
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.
Da PureBasic nur vorzeichenbehaftete Variablen kennt, wird es wohl erst ins negative gehen und dann wieder irgendwann durch Null laufen.

Verfasst: 29.09.2004 16:03
von Falko
Ich glaube, dann würde unendlich das passieren :mrgreen:

Code: Alles auswählen

For i.l=2147483000 To 2147483647
Debug i
Next i

Delay (10000)
MfG Falko

Verfasst: 29.09.2004 22:20
von Quaxi
Danke, werd deine PureTools gleich mal ausprobieren.