AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Anfängerfragen zum Programmieren mit PureBasic.
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Beitrag von interfind »

Hallo,

wenn ich mit AddWindowTimer(0, 1, 60000) einen Timer erstelle
bekomme ich alle 60 Sekunden ein #PB_Event_Timer Ereignis.
Soweit so gut.
Kann ich auch irgendwie ermitteln wieviele Millisekunden
es bis zum nächsten #PB_Event_Timer Ereignis noch sind?

Wo speichert die Funktion den aktuellen Stand ab?
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Beitrag von jacdelad »

Das geht meines Wissens nicht oder nicht so einfach. Speicher am besten den Wert von ElapsedMilliseconds() plus die 60 Sekunden in einer Quadvariable. Dann kannst du mit einer weiteren Abfrage (MeinWert-ElapsedMilliseconds()) sofort die fehlenden Millisekunden ermitteln.

Übrigens sind die Timer-Ereignisse nicht immer 100%-ig genau. Wenn es dir um dir Messung einer Minute geht, solltest du einen Thread nutzen. Wenn nur alle 60 Sekunden, plsu minus, ein Ereignis ausgelöst werden soll, ist's ok.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Beitrag von juergenkulow »

Code: Alles auswählen

; Restliche Wartezeit errechnen und ausgeben.
#Wartezeit=60000
If OpenWindow(0, 0, 0, 400, 100, "Timer Example", #PB_Window_SystemMenu)
    ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
    AddWindowTimer(0, 1, #Wartezeit)
    Start=ElapsedMilliseconds()
    TextGadget(1,10,30,200,20,"Restzeit: "+Str(#Wartezeit)+" ms")
    Value = 0
    Repeat
      Event = WaitWindowEvent(1)
      If Event = #PB_Event_Timer And EventTimer() = 1
        ; Debug Restzeit
        Start=ElapsedMilliseconds()
        Restzeit=#Wartezeit
        Value = (Value + 5) % 100
        SetGadgetState(0, Value)
      Else 
        Restzeit=#Wartezeit-(ElapsedMilliseconds()-Start)
      EndIf    
      SetGadgetText(1,"Restzeit: "+Str(Restzeit)+" ms")
      
    Until Event = #PB_Event_CloseWindow
  EndIf
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Beitrag von interfind »

Hallo juergenkulow und Danke für dein Beispiel.

Aber müsste nicht auch der WindowTimer irgendwo die Restlaufzeit zwischenspeichern
bis er das Timer Ereignis auslöst?
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Beitrag von jacdelad »

Ich bin zwar nicht Jürgen (allerdings heißt mein Vater so): Timermäßig stellt Windows uns nur die Funktionen SetTimer_() und KillTimer_() sowie die Message #WM_TIMER und eine mögliche TimerProc zur Verfügung.
https://learn.microsoft.com/de-de/windo ... msg/timers
Exakt das, was auch PureBasic bietet. Intern wird das sicher irgendwie gepsiechert und abgehandelt, aber als Programmierer hat man da meines Wissens keinen Zugriff darauf. Ich sehe es jetzt auch nicht unbedingt als Problem an, eine Variable mit den entsprechenden Informationen zu befüllen...
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: AddWindowTimer Zeit bis zum nächsten #PB_Event_Timer Ereignis

Beitrag von H.Brill »

Soweit ich weiß, ist das nur ein einfacher Countdown-Zähler im Millisekundenbereich, der ab
den eingestellten ms rückwärts zählt und bei Erreichen von 0 ein Event auslöst und dann wieder
von vorne anfängt. Halt solange, bis man ihn killt. Ob der nun angehalten wird, wenn er einen Event
ausglöst hat ? Kann ja was dauern, wenn man nach dem Timerevent bestimmte Aufgaben bewältigt.
Ich denke, daß er sich, nachdem er einen Event abgesetzt hat, sich neu initialisiert bzw. von vorne wieder
anfängt, sobald die Routine abgearbeitet ist.

Ist ein interessantes Thema, gerade wie so was intern arbeitet. Vielleicht weiß ja jemand mehr.
Den Timer betrachte ich immer als Eieruhr zw. Sanduhr.

In der Richtung gibt es ja verschiedene Sachen : QueryPerformanceCounter, Ellapsedmilliseconds, GetTickCounts usw.
PB 5.60
Antworten