Windows-API Timer

Für allgemeine Fragen zur Programmierung mit PureBasic.
RatProject
Beiträge: 12
Registriert: 01.04.2011 18:54

Windows-API Timer

Beitrag von RatProject »

Hallo,

Ich habe ein Verständnisproblem bezüglich des Windows-API Timer:

Code: Alles auswählen

SetTimer_(WindowID(0),0,50,@MyProcedure())
Dies sollte doch wohl alle 50 Millisekunden meine Prozedur aufrufen.
Tatsächlich geschieht das aber nur alle 62,5 ms bzw. 1/16 Sekunde! Offenbar bekomme ich nur Binär-Bruchteile einer Sekunde, ein Wert von 25 führt also dementsprechend zu einem Intervall von 31,25 ms bzw. 1/32 Sekunde usw.

Habe ich hier einen Denkfehler? :o
Es gibt hier im Forum zahlreiche Themen bezüglich Timer-Programmierung, aber speziell hierzu habe ich nichts gefunden. Sorry, wenn ich etwas übersehen haben sollte und danke schon mal im voraus für eure Hilfe!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Windows-API Timer

Beitrag von ts-soft »

Der zweite Wert sollte ein Nicht-Null Wert sein. Die Timerprocedure muß 4 Parameter haben:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Hier nochmal SetTimer: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Die Genauigkeit beträgt bei aktuellen Windowsversionen ca. 20 ms.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
RatProject
Beiträge: 12
Registriert: 01.04.2011 18:54

Re: Windows-API Timer

Beitrag von RatProject »

Hallo ts-soft,

Vielen Dank für die schnelle Antwort.
Ein Wert ungleich null ändert leider nichts an dem Verhalten. Hier mal ein Testcode:

Code: Alles auswählen

Global time

Procedure timer1(hwnd,uiMsg,idEvent,dwTime)
 Debug ElapsedMilliseconds()-time
EndProcedure

OpenWindow(0,0,0,100,100,#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget,"Timertest")
time=ElapsedMilliseconds()
SetTimer_(WindowID(0),1,50,@timer1())

Repeat
 event=WaitWindowEvent()
Until event=#PB_EventCloseWindow


Dies gibt bei mir Werte im Abstand von 62,5 aus... ich könnte statt elapsedmilliseconds() hier auch dwTime verwenden, ergibt das gleiche.
Ich verwende eine ältere Version von PB (3.90), könnte es damit zu tun haben? Betriebssystem ist Windows7.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Windows-API Timer

Beitrag von ts-soft »

Der Timer hat eine sehr geringe Priorität und ist nicht zum Zeitmessen geeignet.
Das hat auch nichts mit der PB Version zu tun. Abweichungen von 20 ms sind
normal, können bei grösserer Auslastung des Systems auch mehr werden.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
RatProject
Beiträge: 12
Registriert: 01.04.2011 18:54

Re: Windows-API Timer

Beitrag von RatProject »

Ok, dann bin da jetzt etwas schlauer.
Das Intervall von 62,5 ms ist bei mir auch bei großer Auslastung stabil und für meinen Anwendungsfall völlig ausreichend, mich hatten lediglich die Werte überrascht... bei einem Wert von 100 beträgt das Intervall dann auch tatsächlich ganz exakt 125 ms!

Danke nochmal für die Hilfe!
Antworten