Timer in PureBasic

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Quaxi
Beiträge: 66
Registriert: 11.09.2004 12:42

Timer in PureBasic

Beitrag 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!
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
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:

Beitrag 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.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Siehe StartTimer() in PureTools.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag 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
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Benutzeravatar
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:

Beitrag 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.
Bild
Benutzeravatar
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:

Beitrag 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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Quaxi
Beiträge: 66
Registriert: 11.09.2004 12:42

Beitrag von Quaxi »

Danke, werd deine PureTools gleich mal ausprobieren.
Antworten