Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Lebostein

Anmeldungsdatum: 14.06.2005 Beiträge: 9 Wohnort: Buchholz
|
Verfasst am: 14.12.2005, 12:58 Titel: FB Timer ungenau? |
|
|
Hi,
ich komme aus der PureBasic-Ecke und bin gerade dabei, mich mit FB zu beschäftigen und die beiden Sprachen zu vergleichen. Dabei bin ich auf die Timer-Sache gestoßen. Erstmal zu PB:
Code: | ;--------------------------------
OpenConsole()
;--------------------------------
DefType.l time1, time2
time1 = ElapsedMilliseconds()
Delay(1156)
time2 = ElapsedMilliseconds()
PrintN(Str(time2 - time1))
Delay(5000)
;--------------------------------
CloseConsole()
;-------------------------------- |
Mit PureBasic erhalte ich hier zu 95% einen Rückgabewert von exakt 1156 ms. Zu etwa 5% kommt es vor, dass ich hier einen Wert von 1157ms zurückbekomme. Andere Zahlenwerte konnte ich nicht feststellen.
Jetzt habe ich versucht, den Code in FB umzuschreiben:
Code: | '--------------------------------
' Console automatisch offen
'--------------------------------
DIM time1, time2 AS SINGLE
time1 = timer
sleep 1156
time2 = timer
print time2 - time1
sleep 5000
'--------------------------------
' Console wird geschlossen
'-------------------------------- |
Hier erhalte ich sehr stark streuende Werte:
1.957 s
1.442 s
1.607 s
1.109 s
1.534 s
usw.
Ist der FB-Timer so ungenau oder mache ich was falsch? In der Hilfe heißt es sogar, der Timer wäre genauer als 1ms (ganz nebenbei glaube ich gar nicht, dass man die Timer-Variable des Betriebssystems genauer als 1ms auflösen kann und diese Bemerkung in der Hilfe nicht zutreffend ist).... dabei scheint er nicht einmal auf die Sekunde genau zu sein.... oder stimmt da was mit dem SLEEP-Befehl nicht? _________________ "Der Herr der Löffel" |
|
Nach oben |
|
 |
Lebostein

Anmeldungsdatum: 14.06.2005 Beiträge: 9 Wohnort: Buchholz
|
Verfasst am: 14.12.2005, 14:54 Titel: |
|
|
Ich muss mich entschuldigen, ich hab in FB die Variablen falsch deklariert. So muss es richtig sein:
Code: | DIM time1 AS SINGLE
DIM time2 AS SINGLE |
Jetzt ist zwar die Streuung weg, d.h. ich erhalte jedesmal den gleichen Zahlenwert, der aber bei 1.4375 Sekunden liegt, also trotzdem noch falsch ist. Es scheint so, als ob 1 Millisekunde im SLEEP-Befehl eigentlich 1.25 Millisekunden dauern, was sehr verwunderlich ist (1156ms*1.25 = 1445ms = 1.445s) _________________ "Der Herr der Löffel" |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 14.12.2005, 15:04 Titel: |
|
|
sleep macht ja nicht nur pause in deinem programm, der drosselt ja die prozessorauslastung gleich mit indem er die kontrolle zurück an das system gibt, dH er kann unter umständen garnicht so genau sein.. das würd ich jetzt mal vermuten.
wenn du ne gezielte pause in deinem programm brauchst mach das mit do:loop und timer.. dürfte besser sein. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Lebostein

Anmeldungsdatum: 14.06.2005 Beiträge: 9 Wohnort: Buchholz
|
Verfasst am: 14.12.2005, 15:11 Titel: |
|
|
MisterD hat Folgendes geschrieben: | sleep macht ja nicht nur pause in deinem programm, der drosselt ja die prozessorauslastung gleich mit indem er die kontrolle zurück an das system gibt, dH er kann unter umständen garnicht so genau sein.. das würd ich jetzt mal vermuten. |
Das kann natürlich sein. Ich kenn mich in der Geschichte von QB nicht so besonders aus und bin mir jetzt nicht darüber im Klaren, wozu der Befehl SLEEP eigentlich erschaffen wurde, aber schon möglich, dass er sehr ungenau arbeitet. Ich wollte nur irgendwie die TIMER-Anweisung überprüfen und da fiel mir der SLEEP-Befehl ein.... _________________ "Der Herr der Löffel" |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 14.12.2005, 17:03 Titel: |
|
|
Hi,
versuch mal dieses Beispiel, es zeigt das der Timer unter 1ms arbeitet.
Code: | Dim As Double time1, time2
time1 = Timer
Do
Loop While Timer < time1 + 1.156
time2 = Timer
Print time2 - time1
time1 = Timer
Do
Loop While Timer < time1 + 1.15655
time2 = Timer
Print time2 - time1
Sleep |
Sleep ist nicht mit der Delay Anweisung aus PureBasic vergleichbar.
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 14.12.2005, 19:57 Titel: |
|
|
@Lebostein
Der Sleep Befehl aus QuickBasic hat nichts mit dem Sleep Befehl von Freebasic zutun.
Sleep 10 war zu QBasic Zeiten eine Pause die 10 Sekunden dauerte oder bis ein Tastendruck kam, die Zeit wird "verheizt".
Sleep 10 ist in Freebasic eine Pause von 10ms oder bis zum nächsten Tastendruck, während der Wartezeit hat Windows/Linux die Rechenzeit zur Verfügung hat.
Der Sleep Befehl wird in Freebasic primär dazu genutzt, dem Betriebssystem Rechenzeit abzutretten, wie viel Genau spielt eigentlich keine Rolle, häufig wird Pauschal sleep 1 eingesetz, weil dann weder das Programm ruckelt noch die Prozessorlast über wenige Prozent steigt.
Interresant ist das Verhalten von Linux wenn ein Programm zuviel Rechenzeit beziehen will: Die Rechenzeit des Programmes wird so beschniden, das es schneller läuft wenn es regelmässig freiwillig 1ms abgibt.
Kurz: Sleep ist kein Präzisions Instrument wie Delay, dafür vermute ich das Delay die Rechenzeit in einer Schlaufe verpulvert. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 15.12.2005, 15:29 Titel: |
|
|
Hi,
das Problem mit 'Sleep 1156' scheint Platformabhängig zu sein?
Code: | Dim As Single time1, time2
time1 = Timer
Sleep 1156
time2 = Timer
Print time2 - time1
Sleep | Gestern, auf einem PC mit XP, konnte ich Lebosteins Werte (Sleep 1156 > 1,445 s) nur bestätigen.
Heute, auf einem PC mit ME und einem Laptop mit 98SE, bekonnte ich bei 'Sleep 1156' relativ konstant 1,15625 s.
@Michael Frey
Sleep hat noch eine Besonderheit, wenn die Verzögerungszeit kleiner 100ms angegeben wird, findet keine Tastaturabfrage (also keine Unterbrechung) statt.
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 15.12.2005, 18:48 Titel: |
|
|
Code: | Dim time1 As Single
Dim time2 As Single
dim x as single
screen 12
for i=1 to 20
time1 = Timer
Sleep 1156
time2 = Timer
? time2 - time1
next i
Sleep |
Die Werte sind bei mir bei rund 1.1596.
Das Verändern der Pirotät hat bei Win XP bei schwacher Belastung keinen Einfluss, aber unter volllast ist der Einfluss sehr gross. Ich mess deutlich über 5 Sekunden!
(Die Volllast hab ich mit Do: ? "waw": Loop erzeugt)
@Volta
Danke für den Hinweiss, wieder was gelernt. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 15.12.2005, 19:41 Titel: |
|
|
volta hat Folgendes geschrieben: |
...
das Problem mit 'Sleep 1156' scheint Platformabhängig zu sein?
...
|
Hallo.
Ich denke mal, dass bei windows kein eigener sleep befehl gemacht wurde. In der WinAPI gibt es einen gleichnamigen Befehl. Warscheinlich liegt das Problem also dann bei windows.
*Klick*
Ich werde das mal testen.
Michael
EDIT:
Getested, meine Vermutung war falsch. Der WinAPI Timer ist genauer. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 15.12.2005, 19:59 Titel: |
|
|
Wie hast du den Sleep Befehl der WinApi in Freebasic genutzt?
Ich erhalte beim Versuch "Duplicated definition".
Edit:/
Ich hab's:
Code: | Declare Sub SleepAPI Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Integer)
Dim time1 As Single
Dim time2 As Single
dim x as single
screen 12
for i=1 to 20
time1 = Timer
SleepAPI 1156
time2 = Timer
? time2 - time1
next i
Sleep |
Naja, bei mir ist der Unterschied recht klein ... _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 15.12.2005, 20:19 Titel: |
|
|
Ich würde das dann auf dauer so lösen:
Code: | option nokeyword sleep
Declare Sub Sleep Lib "kernel32" alias "Sleep" (ByVal dwMilliseconds As Integer)
Dim time1 As Single
Dim time2 As Single
screen 12
time1=timer
Sleep 1234
time2=timer
print time2-time1
getkey 'Sleep ohne argumente geht ja nicht mehr, getkey macht das gleiche
|
So braucht man den normalen code dann fast nicht zu ändern. Man kann das auch mit ner eigenen sub machen, aber so gehts ja auch.
Michael |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 16.12.2005, 12:23 Titel: |
|
|
Hi,
echt krass, unter XP verzögert 'sleep' wesentlich länger als die angegebene ms-Zahl und 'kernel32 - sleep' verzögert konstant etwas kürzer als die angegebene ms-Zahl.
Wenn es mir um eine exaktere Zeitverzögerung geht (Messen, Steuern, Regeln) werde ich auf den Timer zurückgreifen. Damit hab ich unter allen Win-Versionen (wohl auch auf anderen Platformen) die genaueste Zeitmessung -verzögerung.
Sleep bleibt mir so als nützliche und 'lieb gewordene' Basic-Anweisung für andere Zwecke erhalten.
Code: | Dim As Double time1, time2
Sub delay (ByVal Milliseconds As Integer = 1)
Dim As Double tms
If Milliseconds < 1 Then Milliseconds = 1 'denke an den DAU
tms = Timer + (CDbl(Milliseconds) / 1e3)
Do
Loop While Timer < tms
End sub
time1 = Timer
delay 156
time2 = Timer
Print "dauert " & (Timer - time1) & " Sekunden."
Sleep |
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 16.12.2005, 18:29 Titel: |
|
|
@Volta
Bei Linux kann das nach hinten losgehen, wenn unter Linux ein Programm Vollast macht, wird im Rechenzeit entzogen, das Programm Ruckelt.
Nur Windows/Dos ist so "Dumm" einen Programm ohne Rucksicht auf Verluste 100% Rechenzeit zu geben.
Unter Linux wird man kaum um Sleep aus kommen. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 17.12.2005, 18:47 Titel: |
|
|
Ja sicher, aber so, wie ich den Diskussionsverlauf verstanden habe, ist SLEEP unter Linux sowiso genau, da hier ja keine Kommandoübergabe ans OS stattfindet... oder?
SLEEP hat ja nur unter WIN32 den Effekt von DoEvents (VB)..? _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 18.12.2005, 09:01 Titel: |
|
|
Komandoübergabe ist unter Linux mit dem Sleep Befehl möglich, und im gegensatz zu Windows auch zu empfehlen
Mein Schaltungssimulator war unter Linux absolut unbrauchbar (es ruckelte extrem), bis ich ein simples sleep 1 eingefügt habe.
Soviel ich weiss entzieht Linux Programmen Rechenzeit die Volllast erzeugen, Grund dafür ist die Annahme das Interaktive Programme kaum Last erzeugen, aber sofort reagieren müssen und Programme die z.B. einen Film-Rendern erzeugen viel Last, müssen aber nicht sofort reagieren. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
|