Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

FB Timer ungenau?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lebostein



Anmeldungsdatum: 14.06.2005
Beiträge: 9
Wohnort: Buchholz

BeitragVerfasst am: 14.12.2005, 12:58    Titel: FB Timer ungenau? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Lebostein



Anmeldungsdatum: 14.06.2005
Beiträge: 9
Wohnort: Buchholz

BeitragVerfasst am: 14.12.2005, 14:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 14.12.2005, 15:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lebostein



Anmeldungsdatum: 14.06.2005
Beiträge: 9
Wohnort: Buchholz

BeitragVerfasst am: 14.12.2005, 15:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 14.12.2005, 17:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 14.12.2005, 19:57    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 15.12.2005, 15:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 15.12.2005, 17:06    Titel: Antworten mit Zitat

Hallo,

da kommt mir eine Idee: Setz die Priorität der Anwendung mal auf "Hoch" oder "Echtzeit". Vielleicht sind die Werte ja dann auch auf XP ganz genau! lächeln

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 15.12.2005, 18:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 15.12.2005, 19:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 15.12.2005, 19:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 15.12.2005, 20:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 16.12.2005, 12:23    Titel: Antworten mit Zitat

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. durchgeknallt
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 16.12.2005, 18:29    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 17.12.2005, 18:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 18.12.2005, 09:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz