Code: Alles auswählen
nextPrint = ElapsedMilliseconds() + 1000
count = 0
Repeat
If ElapsedMilliseconds() >= nextPrint
nextPrint + 1000
Debug "Event!"
count + 1
EndIf
Until count = 10
Code: Alles auswählen
nextPrint = ElapsedMilliseconds() + 1000
count = 0
Repeat
If ElapsedMilliseconds() >= nextPrint
nextPrint + 1000
Debug "Event!"
count + 1
EndIf
Until count = 10
Das stimmt. Kommt drauf an, ob diese kleine Verzögerung überhaupt ein Problem ist. In den meisten Fällen eher nicht, aber falls doch, dann muss man eine andere Variante nehmen.Bisonte hat geschrieben:Wenn zum Beispiel ein Fenster mal heftig viele Events [...] dann wird das TimerEvent natürlich "obenauf" in die Warteschlange der Events abzuarbeiten hat gelegt.
Und schon sind es nicht mehr 1000ms sondern vielleicht 1009ms
Das stimmt. Dafür gibt es zum Glück BindEvent, was natürlich meiner Meinung nach sogar die bessere Wahl ist, wenn man mit Events arbeiten möchte.Bisonte hat geschrieben:der Klassiker : der User bewegt das Fenster
Code: Alles auswählen
EnableExplicit
Procedure Timer()
Select EventTimer()
Case 1
Debug "Timer-Event wird jede Sekunde ausgelöst."
EndSelect
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
AddWindowTimer(0, 1, 1000)
BindEvent(#PB_Event_Timer, @Timer())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Bei ElapsedMilliseconds() war das zumindest früher so. Da hast du in Windows Rückgabewerte nur in 32ms (ich glaube zumindest, dass es 32 waren) Schritten bekommen. Vor ca. 1-2 Jahren hat Fred intern auf einen anderen Timer umgestellt, seit dem kann ElapsedMilliseconds() viel genauer sein.Bisonte hat geschrieben:Ich meine auch irgendwo im Forum gelesen zu haben, dass der WindowsTimer/ElapsedMilliseconds() von Haus aus mit Zeiten unter 50ms Probleme hat, diese korrekt einzuhalten.
Also wenn ich genau diesen Schnipsel ausführe, steigt meine CPU-Auslastung nicht über 12%. Mit Delay(1) bleibt sie allerdings relativ konstant beim Default-Wert.NicTheQuick hat geschrieben:Es geht dabei nicht um Unzuverlässigkeit, sondern darum wie du programmierst. Das folgende Schnipsel wird dir jede Sekunde eine Ausgabe im Debug-Fenster geben. Gleichzeitig verbrauchst du dabei 100% CPU-Last, was nicht gut ist.Ein kleines Delay(10) in der Schleife würde die CPU-Last drastisch reduzieren, aber dann kann es passieren, dass der Body vom If nicht rechtzeitig ausgeführt wird, sondern bis zu 10 ms zu spät.Code: Alles auswählen
nextPrint = ElapsedMilliseconds() + 1000 count = 0 Repeat If ElapsedMilliseconds() >= nextPrint nextPrint + 1000 Debug "Event!" count + 1 EndIf Until count = 10
Diese Aussage muss ich zurücknehmen. Das war mal so. Es wurde in der Tat geändert und es beginnt neuerdings immer mit 0.RSBasic hat geschrieben:Unter Windows wird soweit ich weiß die Zeit in Millisekunden seit dem Windows-Start zurückgegeben
Fazit, die Ergebnisse sind unterschiedlich denn sie sind BETRIEBSSYSTEM-ABHÄNGIG.Remarks hat geschrieben:The absolute value returned is of no use since it varies depending on the operating system. Instead, this function should be used to calculate time differences between multiple ElapsedMilliseconds() calls.
This function is relatively accurate: it may have a slight variation, depending on which operating system it is executed on, this is due to the fact that some systems have a lower timer resolution than others.
Bei 8 Kernen hast du eine Auslastung von etwa 12%. Das heisst das einer der Kerne gerade auf 100% laeuft.diceman hat geschrieben:Also wenn ich genau diesen Schnipsel ausführe, steigt meine CPU-Auslastung nicht über 12%. Mit Delay(1) bleibt sie allerdings relativ konstant beim Default-Wert.NicTheQuick hat geschrieben:Es geht dabei nicht um Unzuverlässigkeit, sondern darum wie du programmierst. Das folgende Schnipsel wird dir jede Sekunde eine Ausgabe im Debug-Fenster geben. Gleichzeitig verbrauchst du dabei 100% CPU-Last, was nicht gut ist.Ein kleines Delay(10) in der Schleife würde die CPU-Last drastisch reduzieren, aber dann kann es passieren, dass der Body vom If nicht rechtzeitig ausgeführt wird, sondern bis zu 10 ms zu spät.Code: Alles auswählen
nextPrint = ElapsedMilliseconds() + 1000 count = 0 Repeat If ElapsedMilliseconds() >= nextPrint nextPrint + 1000 Debug "Event!" count + 1 EndIf Until count = 10