[ *mile* @ 27.01.2007. 21:34 ] @
Pozdrav, kako da kontrolisem vremenske intervale manje od 1 milisekunde. Unapred zahvalan...Milan |
[ *mile* @ 27.01.2007. 21:34 ] @
[ Srki_82 @ 27.01.2007. 21:50 ] @
Kodom koji se izvrsava za vreme manje od 1 ms :)
Kako mislis "kako da kontrolises intervale"!? [ savkic @ 27.01.2007. 22:33 ] @
> kako da kontrolisem vremenske intervale manje od 1 milisekunde. Intervali ispod 1ms se mogu dobiti pomoću QueryPerformanceCounter API funkcije i RDTSC cpu asemblerske instrukcije. Za oba možeš potražiti primere i dalja objašnjenja na ovom forumu. Takođe, ne očekuj čuda, Windows nije real time OS i nije namenjen pouzdanom radu sa tako malim intervalima, i to svakako ne u user mode aplikacijama. [ reiser @ 28.01.2007. 00:23 ] @
Code: // Delay * 100ns (e.g. PreciseDelay(10) will sleep 1000ns) procedure PreciseDelay(const Delay : Int64); var Timer : THandle; LargeInt : Int64; begin Timer := CreateWaitableTimer(nil, FALSE, 'MyPreciseTimer'); If Timer <> 0 Then Begin Try LargeInt := -Delay; SetWaitableTimer(Timer, LargeInt, 0, nil, nil, FALSE); WaitForSingleObject(Timer, INFINITE); Finally CloseHandle(Timer); End; End; end; [ *mile* @ 28.01.2007. 12:38 ] @
E upavo mi ovo treba, znaci generisanje pauze (mada to sam trebao da kazem odmah...)
A sto se preciznosti tice nije mi mnogo bitna. Konkretno treba mi pauza od nekih 10 mikrosekundi, e sad da li ce ta pauza da bude 15 ili 20 mikrosek. potpuno nebitno. Jedino sto mi je do sada padalo na pamet je asm instukcija NOP ali ova reiser-ova procedura je mnogo elegantnija. Pozdrav svima i hvala. [ savkic @ 29.01.2007. 08:31 ] @
> E upavo mi ovo treba, znaci generisanje pauze (mada to sam trebao da kazem odmah...)
> A sto se preciznosti tice nije mi mnogo bitna. Konkretno treba mi pauza od nekih 10 > mikrosekundi, e sad da li ce ta pauza da bude 15 ili 20 mikrosek. potpuno nebitno. Sa SetWaitableTimer tu preciznost možeš dostići samo ako računar ima praznog hoda, ako nešto radi onda teško to možeš postići, a svakako ne uvek. Veće šanse su (i kod opterećenih računara) ako se koristi petlja i RDTSC ili QueryPerformanceCounter za merenje protoka vremena. [ *mile* @ 04.02.2007. 00:01 ] @
Pozdrav,
ali kad traje pauza nista se drugo nece izvrsavati, sem ako OS radi nesto u pozadini. Mada probacu sve predloge pa koji se najbolje pokaze....sve najbolje. [ savkic @ 04.02.2007. 11:00 ] @
> ali kad traje pauza nista se drugo nece izvrsavati, sem ako OS radi nesto u pozadini.
> Mada probacu sve predloge pa koji se najbolje pokaze....sve najbolje. Itekako hoće, ne možeš se pouzdati da baš u tom trenutku se ne okine SysterRestore service, mrežni zahtev, indeksiranje, startovanje user application, skeniranje virusa... Nema garancija čak ni sa dedicated mašinama. [ Vdjuric @ 06.02.2007. 09:47 ] @
Meni bi trebalo nesto slicno...
![]() Kako da izmerim tacno vreme za koje si izvrsava neka procedura? U pitanju su velicine od otprilike 20-30ms... U toj proceduri se nalazi kod za komunikaciju sa LPT uredjajem, i na vecini kompjutera se to lepo odradi preko 2 poziva gettickcount funkcije... I izmererno vreme varira izmedju 20 i 40ms... E sad, u najvecem broju slucajeva na istom kompu to vreme bude uvek isto, npr 31ms... Pa mi je to nekako sumnjivo... ali, problem nije u tome - problem se javlja sto neki kompovi daju vreme 10, ili jos gore 0!!! Apsolutno mi je nemoguce da se ta procedura toliko brzo izvrsi na njima! Posebno me nervira sto su cesto u pitanju neki krsevi od kompova koji tu proceduru "izvrse" brze nego neka nova cetvorka?!? Ima li neko ideju o cemu se ovde radi i kako to resiti? [ Rapaic Rajko @ 03.03.2007. 16:09 ] @
Kombinacijom funkcija QueryPerformanceFrequency i QueryPerformanseCounter mozes resiti problem merenja malih intervala.
Procitaj u Delphi help-u; ides na Help->Windows SDK-> Index, ukucaj i pogledaj... Rajko Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|