Timer in PureBasic
Timer in PureBasic
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!
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!
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Ich würde das mal wieder so machen:
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.
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
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.
..... 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 ?
---> sonstige Möglichkeiten : Programm stürzt ab, PC explodiert ,
Festplatte wird gelöscht ........
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
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.
Festplatte wird gelöscht ........
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
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Ausprobieren...
///Edit:
Aus der MSDN von [c]GetTickCount_()[/c], das sicherlich genauso funktioniert wie [c]ElapsedMilliseconds()[/c]
///Edit:
Aus der MSDN von [c]GetTickCount_()[/c], das sicherlich genauso funktioniert wie [c]ElapsedMilliseconds()[/c]
Da PureBasic nur vorzeichenbehaftete Variablen kennt, wird es wohl erst ins negative gehen und dann wieder irgendwann durch Null laufen.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.
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Ich glaube, dann würde unendlich das passieren
MfG Falko
Code: Alles auswählen
For i.l=2147483000 To 2147483647
Debug i
Next i
Delay (10000)