Frage zur genauen Funktionsweise von ElapsedMilliseconds()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Frage zur genauen Funktionsweise von ElapsedMilliseconds()

Beitrag von diceman »

Nur damit ich das richtig verstehe ...
Es scheint so, daß ElapsedMilliseconds() immer 0 zurückgibt beim allerersten Aufruf (dabei ist es egal, ob im Hauptprogamm oder in irgendeiner Prozedur).
Ab dem ersten Aufruf zählt der Timer im Hintergrund kontinuierlich hoch, und kann jederzeit mit

Code: Alles auswählen

someTimer = ElapsedMilliseconds()
"abgefangen" werden, und so für allerhand nette Timing-basierte Abfragen genutzt werden. Ein konkretes Beispiel wäre zum Beispiel das Verhalten der Geister bei Pacman, die immer nach gewissen Zeitintervallen zwischen Roaming-Mode und Search-Mode wechseln. Also wenn ich ein Programm schreibe, in dem ich Millisekunden-Abfrage benötige, reicht es einmal zum Programmstart ElapsedMilliseconds() ohne Rückgabewert aufrufen, um den globalen Millisekunden-Timer zu initialiseren, oder?
Zuletzt geändert von diceman am 08.02.2018 15:33, insgesamt 2-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von Josh »

ElapsedMilliseconds() ist eher dafür gedacht, eine Zeitdifferenz zu bekommen. Ich bin mir nicht mal sicher, ob ElapsedMilliseconds() bei allen OS mit 0 beginnt. Da hat sich mal was geändert.

Code: Alles auswählen

time = ElapsedMilliseconds()
Delay (1)
time = ElapsedMilliseconds() - time

Debug time

Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von RSBasic »

Mit ElapsedMilliseconds() kannst du die Differenz zweier Zeitwerte ermitteln und kannst damit herausfinden, wie lange ein Vorgang, der dazwischen durchgeführt wurde, gedauert hat. Beispiel aus der Hilfe:

Code: Alles auswählen

StartTime = ElapsedMilliseconds()             ; ermittelt den aktuellen Wert
  Delay(1000)                                   ; wartet 1000 Millisekunden
  ElapsedTime = ElapsedMilliseconds()-StartTime ; der 'ElapsedTime' Wert sollte ca. 1000 Millisekunden betragen
Die 2. Zeile soll nur den Vorgang, der eine Sekunde dauert, simulieren.

Wenn du ein Fenster hast und du möchtest alle 100 Millisekunden was ausführen, dann ist AddWindowTimer sinnvoller.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von diceman »

Ja, das ist schon klar. Ging mir um die grundsätzliche Funktionsweise. :)
Jetzt kommt mir meine Frage fast schon wieder ein bißchen doof vor. Ist halt nur so, daß folgender Code bei Blitzbasic 1000 zurückgegeben hätte (eben weil der Millisekunden-Timer bei Programmstart immer automatisch initialisiert wurde), bei PB dagegen 0.

Code: Alles auswählen

Delay(1000)
time = ElapsedMilliseconds()
Debug time
Trotzdem danke für die Antworten.
Ich habe mir nämlich angewöhnt, abgelaufene Timer-Variablen, sobald die zugehörige IF-Abfrage triggert, auf 0 zurückzusetzen, so daß ich immer abfragen kann, ob ein Timer noch aktiv zählt, oder wieder inaktiv ist.
Zuletzt geändert von diceman am 08.02.2018 15:43, insgesamt 1-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von RSBasic »

Unter Windows wird soweit ich weiß die Zeit in Millisekunden seit dem Windows-Start zurückgegeben, aber welcher Wert zurückgegeben wird, kann dir egal sein. Wichtig ist nur, dass du die Differenz ermitteln kannst. Wie lange z.B. deine Anwendung läuft, kannst du so machen, dass du in der ersten Zeile time = ElapsedMilliseconds() aufrufst und später, wenn du die Prozessdauer ermitteln möchtest, einfach nochmal aufrufst und die Differenz ermittelst. Dann weißt du, wie lange deine Anwendung lief.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von diceman »

Alles klar jetzt. :allright:
Meinetwegen kann der Thread auch wieder gelöscht werden; ist mir jetzt fast schon wieder peinlich, sowas gefragt zu haben.
Zuletzt geändert von diceman am 08.02.2018 15:51, insgesamt 2-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von RSBasic »

Nein, peinlich ist das auf keinen Fall. Ich finde, das war eine ganz normale Frage, die für zukünftige Einsteiger hilfreich sein wird.
Jeder fängt klein an. Niemand weiß alles. Außerdem hast du deine Frage im Anfänger-Unterforum gestellt. Also gar kein Problem. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von diceman »

Jetzt habe ich doch noch eine Frage:
Du sagst, daß man bei Fensteranwendungen lieber AddWindowTimer() nutzen sollte ... gibt es dafür einen Grund? Weil, wenn ich jetzt grundsätzlich plane, Fullscreen und Fenster-Modus optional anzubieten, würde ich doch lieber bei einer (nämlich der ElapsedMilliseconds() )-Variante bleiben, sonst muß ich ja jede Timer-Abfrage doppelt programmieren - einmal für Fullscreen, einmal für Fenster-Modus.
Oder ist ElapsedMilliseconds() im Fenster-Modus unzuverlässig?
Zuletzt geändert von diceman am 08.02.2018 15:58, insgesamt 1-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von RSBasic »

Wenn du Fullscreen (OpenScreen) und Fenster-Modus machen möchtest, hast du natürlich recht. Dann kannst du mit ElapsedMilliseconds arbeiten.
Nur wenn du reine Fenster-Anwendungen schreiben möchtest, kannst du die Timer-Funktion benutzen. Du kannst aber auch ElapsedMilliseconds benutzen, nur ist es mit der Timer-Funktion komfortabler.
Wie es bei Fenstern mit der Event-Timer-Funktion aussieht, hier ein Beispielcode, falls du irgendwann mal eine reine Fenster-Applikation erstellen möchtest:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  AddWindowTimer(0, 1, 1000)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Timer
        Select EventTimer()
          Case 1
            Debug "Timer-Event wird jede Sekunde ausgelöst."
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Frage zur genauen Funktionsweise von ElapsedMilliseconds

Beitrag von diceman »

Danke, ist notiert!
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten