Toon posts:

functie timen in C++

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil in C++ zo programeren dat hij om de 1/600 seconden een functie uitvoerd. Ik gebruik nu daarvoor een For statement en heb uitgerekend hoeveel loops hij moet maken om 1/600sec te maken (dit is niet helemaal nauwkeurig). Delays hebben we ook geprobeert, maar werkt ook niet helemaal.
Heeft iemand enig idee om dit op te lossen, door bijvoorbeeld de tijd uit de bios te halen, of een functie waarin je het aantal seconden of miliseconden kan invoer.

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 08:47

BCC

sleep() ?

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • krietjur
  • Registratie: Februari 2001
  • Nu online

krietjur

Where am I?

aantal for-loops is inderdaad niet nauwkeurig, want dat zal per systeem verschillen enzo ;)

Zoek eens naar de funtie timegettime(), die heb ik ooit voor dit doeleinde gebruikt..

  • beany
  • Registratie: Juni 2001
  • Laatst online: 09:02

beany

Meeheheheheh

Op dinsdag 16 april 2002 23:13 schreef chourak het volgende:
Ik wil in C++ zo programeren dat hij om de 1/600 seconden een functie uitvoerd. Ik gebruik nu daarvoor een For statement en heb uitgerekend hoeveel loops hij moet maken om 1/600sec te maken (dit is niet helemaal nauwkeurig).
.
.
.
Eeuuhhm, ben geen C programmeur hoor, maar als je dat loopie nou op een snellere of langzamere computer draait???? Niet erg portable lijkt me ;)

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

usleep() ?

  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Umz... De realtime clock loopt toch tot op de milliseconde?

Forget your fears...
...and want to know more...


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 08:47

BCC

Op dinsdag 16 april 2002 23:18 schreef Aetje het volgende:
Umz... De realtime clock loopt toch tot op de milliseconde?
Eeeh, Jawel!

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Probeer eens een thread te starten met een hele hoge prioriteit (of zelfs time_critical? let op alleens als het een eindigend proces is ;)) en dan usleep() gaan gebruiken.

  • Tripp
  • Registratie: Januari 2000
  • Laatst online: 16-03-2024

Tripp

Wreah

in java is het System.thread.sleep() :)

misschien ist in c++ wel net zoiets.

maar ja kheb geen c++ gehad (nog) :)

specs


Verwijderd

een for lus gebruiken voor delays is niet verstandig omdat je te maken hebt met:

- thread priorities
- thread quantum time
- cpu optimalisaties
- cpu snelheid
- compiler opts
....
....

Als je de doorlooptijd van een functie wilt *timen* dan
zou je dat met de timestamp faciliteiten die in moderne cpu's zitten kunnen meten. Kijk maar eens op de intel site en zoek naar RDTSC.

Als je een functie ELKE 1/600 seconde wilt laten aanroepen
dan zou je kun je dat op het windows platform met een waitable timer object event realiseren. In usermode gebruik je hiervoor de xxxWaitableTimer() functies en in kernelmode KeInitializeTimer(), KeReadStateTimer(), KeSetTimer().

  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Zoek anders ns in de msdn op QueryPerformanceCounter en QueryPerformanceFrequency, hiermee kun je vrij simpel een timer maken met een hoge resolutie.

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


Verwijderd

Precies, dat is het meest nauwkeurige.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op dinsdag 16 april 2002 23:13 schreef chourak het volgende:
Ik wil in C++ zo programeren dat hij om de 1/600 seconden een functie uitvoerd. Ik gebruik nu daarvoor een For statement en heb uitgerekend hoeveel loops hij moet maken om 1/600sec te maken (dit is niet helemaal nauwkeurig). Delays hebben we ook geprobeert, maar werkt ook niet helemaal.
Heeft iemand enig idee om dit op te lossen, door bijvoorbeeld de tijd uit de bios te halen, of een functie waarin je het aantal seconden of miliseconden kan invoer.
600 Hz begint lastig te worden. Dat ligt niet aan C++, maar aan het ondeliggende OS. Wat is precies je eis, 16.7 ms +/- hoeveel, hoe vaak mag het fout gaan, zijn er eisen aan opeenvolgende fouten, ...

Als je die vragen eerst beantwoord kunnen we daarna dieper ingaan op de vraag hoe je dat implementeert.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Op woensdag 17 april 2002 09:29 schreef MSalters het volgende:

[..]

600 Hz begint lastig te worden. Dat ligt niet aan C++, maar aan het ondeliggende OS. Wat is precies je eis, 16.7 ms +/- hoeveel, hoe vaak mag het fout gaan, zijn er eisen aan opeenvolgende fouten, ...

Als je die vragen eerst beantwoord kunnen we daarna dieper ingaan op de vraag hoe je dat implementeert.
Dat hangt maar net van je OS af natuurlijk. Onder windows vind ik 600Hz ook wel erg hoog, hoewel 't nog net zou kunnen (gemiddeld 600x per seconde (+/- 1) haal je iig wel, maar de tijd tussen de aanroepen zou dan wel op 16.7 ms +/- 50% komen te liggen denk ik. (De normale libraries kunnen dit geloof ik niet. Sleep heeft een minimum van 10ms en een nauwkeurigheid van 1 ms, met een afwijking van +/- 0.5 ms. (onder winNT that is))
Overigens voorspel ik dat 't met windows-messages niet gaat lukken.

Onder linux is 't zeer goed mogelijk. De GNU library biedt de functie nanosleep, die zulke frequenties nog wel aankan.

Onder dos is 't helemaal een eitje. Je zult wellicht wat assembly moeten klooien, maar omdat je de processor helemaal voor jezelf hebt, kun je gewoon een serie NOP's uitvoeren tot de tijd om is, dat kan dus met de nauwkeurigheid van je kloksnelheid.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Het bekijken van real-time tijden alleen is niet voldoende. Daarmee bereken je in welke tijdsspanne een proces (functie) uitgevoerd heeft, maar niet voor welk deel van die tijdsspanne het proces actief was. Er zijn immers ook andere processen die processortijd opeisen. Het wordt helemaal een ingewikkeld verhaal als je zoveel I/O als processortijden wilt meten. De specifieke oplossing hangt dus een beetje af van je platform en API (onder Windows heb ik geen idee).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op woensdag 17 april 2002 09:36 schreef Poohbear het volgende:
Onder dos is 't helemaal een eitje. Je zult wellicht wat assembly moeten klooien, maar omdat je de processor helemaal voor jezelf hebt, kun je gewoon een serie NOP's uitvoeren tot de tijd om is, dat kan dus met de nauwkeurigheid van je kloksnelheid.
Dan moet je dus wel de kloksnelheid van de CPU kennen en eigenlijk ook alle andere eigenschappen, om te kunnen compenseren voor optimalisaties als pipelining,

Verwijderd

Op woensdag 17 april 2002 09:36 schreef Poohbear het volgende:
Sleep heeft een minimum van 10ms en een nauwkeurigheid van 1 ms, met een afwijking van +/- 0.5 ms. (onder winNT that is))
Fout, preciesie van sleep is beroerder dan je denkt.. een sleep rond altijd af
op de volgende eenheden:

9x ~47 ms
NT-SingleProc ~15 ms
NT-MultiProc ~10 ms

kortom een sleep(16) zal ~30 worden op een standaard nt bak..

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Op woensdag 17 april 2002 10:29 schreef Soultaker het volgende:

[..]

Dan moet je dus wel de kloksnelheid van de CPU kennen en eigenlijk ook alle andere eigenschappen, om te kunnen compenseren voor optimalisaties als pipelining,
Hmm... niet echt belangrijk. Op het x86 platform is een NOP een echte NOP, daarop wordt niet geoptimaliseerd zolang je in real-mode (dos dus) werkt. Elke NOP kost je dus precies 1/kloksnelheid seconde. Je kloksnelheid bepalen is natuurlijk een eitje.

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Op woensdag 17 april 2002 11:14 schreef Yarvieh het volgende:

[..]

Fout, preciesie van sleep is beroerder dan je denkt.. een sleep rond altijd af
op de volgende eenheden:

9x ~47 ms
NT-SingleProc ~15 ms
NT-MultiProc ~10 ms

kortom een sleep(16) zal ~30 worden op een standaard nt bak..
Hmm... Normaal wel, maar als je je multimedia timers aanzet ga je er aardig op vooruit. Overigens was het onder 9x toch 55 ms? (1/65535 uur).


edit: Een leuke link http://www.codeproject.com/system/timers_intro.asp

edit2: Nu weten we nog steeds niet welk OS de topicstarter gebruikt...

Verwijderd

Op woensdag 17 april 2002 11:40 schreef Poohbear het volgende:

[..]

Hmm... Normaal wel, maar als je je multimedia timers aanzet ga je er aardig op vooruit. Overigens was het onder 9x toch 55 ms? (1/65535 uur).


edit: Een leuke link http://www.codeproject.com/system/timers_intro.asp

edit2: Nu weten we nog steeds niet welk OS de topicstarter gebruikt...
Behoorlijk slecht dus de precisie van Sleep, k had niet gedacht dat t zo erg was. Is er geen betere manier die geen CPU-capaciteit gebruikt?

Ik dat artikel staat dit:
Waitable timers were introduced with Windows 98 and Windows NT 4.0
Voorgens mij zit Sleep ook gewoon in Windows 95 :?

Verwijderd

Op woensdag 17 april 2002 12:31 schreef dev het volgende:
Voorgens mij zit Sleep ook gewoon in Windows 95 :?
Een waitable timer doe je ook niet met sleep maar met CreateWaitableTimer :Y)

Verwijderd

Op woensdag 17 april 2002 12:36 schreef Yarvieh het volgende:

[..]

Een waitable timer doe je ook niet met sleep maar met CreateWaitableTimer :Y)
Je hebt gelijk, ik zocht even op Sleep en zag m daar staan, maar had t niet echt goed bekeken :P

Het zou mooi zijn als het mogelijk is om een nauwkeurigere Sleep uit te voeren :) Maar is vrees dat dit de enige functie daarvoor is.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
Op woensdag 17 april 2002 09:36 schreef Poohbear het volgende:

Onder linux is 't zeer goed mogelijk. De GNU library biedt de functie nanosleep, die zulke frequenties nog wel aankan.
nanosleep() is goed voor de precisie, maar als je proces niet gescheduled wordt dan is dat toch minder. Hoe voorkom je in Linux dat een driver meer dan 1/600 seconde CPU-tijd gebruikt, en daarmee je proces block t?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Niet. Maar welke driver heeft 1/600 s nodig om een taak uit te voeren?

Verwijderd

in de win32API
GetTickCount (aantal milliseconden dat windows is opgestart)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. If you need a higher resolution timer, use amultimedia timer or a high-resolution timer.
Pagina: 1