Cześć.
Czy ktoś wie jak zmniejszyć czas tykania zegara (interval) na mniejszy - po niżej 1ms (chodzi mi żeby uzyskać około 500ns).
TTimer jest do tego najbardziej nieodpowiednim narzędziem... Tak naprawdę to nie zejdziesz poniżej ok 18/sek częstotliwości...
Potrzebuję wygenerować zegar wykorzystując linię DTR Coma. Timere uzyskałem najmniej 1ms. W jaki inny sposób mogę uzyskać taki czas (500 ns).
GetTickCount(), funkcja ta zwraca ci... przeczytaj w helpie:)
Return Values
If the function succeeds, the return value is the number of milliseconds that have elapsed since Windows was started.
PS> niżej trudno zejść
//-------------------------------------------------------
Mam na komputerze takie coś:
LARGE_INTEGER lpFrequency;
LARGE_INTEGER lpPerformanceCountStart, lpPerformanceCountEnd;
if (QueryPerformanceFrequency(&lpFrequency) != 0)
{
QueryPerformanceCounter(&lpPerformanceCountStart);
for (long int i = 0; i <= 100000000; i++);
QueryPerformanceCounter(&lpPerformanceCountEnd);
double Frequency = lpFrequency.QuadPart;
double End = lpPerformanceCountEnd.QuadPart;
double Start = lpPerformanceCountStart.QuadPart;
Form1->Caption = FloatToStr((End - Start) / Frequency) + " s.";
}
Nie pytajcie mnie co to jest - znalazłem w jednym z moich starych programow - pewne skądś ściągnięte 8)
[Przepraszam, że piszę PostByPost, ale robię to w pełni świadomie, dla czytelności kodu].
Gdybyś chciał zobaczyć jak to działa to (przepraszam, za 'nieprofesinalność' i brak optymalizacji, ale to tylko przykład):
LARGE_INTEGER lpFrequency;
LARGE_INTEGER lpPerformanceCountStart, lpPerformanceCountEnd;
double Frequency;
double End;
double Start;
if (QueryPerformanceFrequency(&lpFrequency) != 0)
{
QueryPerformanceCounter(&lpPerformanceCountStart);
for (int i=0; i<999999999999999; i++)
{
QueryPerformanceCounter(&lpPerformanceCountEnd);
Application->ProcessMessages();
Frequency = lpFrequency.QuadPart;
End = lpPerformanceCountEnd.QuadPart;
Start = lpPerformanceCountStart.QuadPart;
Form1->Caption = FloatToStr((End - Start) / Frequency) + " s.";
}
}
Obejrzyj sobie działanie tego kodu (na belce tytułowej formy)
PS> HELP - rządzi i wymiata!!
Ale ten zegar tyka sobie jak sam chce (chodzi mi o ns części). Mnie chodzi o to by tykał dokładnie co 500ns i zgłaszał komunikat o zdarzeniu w celu ich zliczanie (muszę liczyć ilość tyknięć.)
po prostu wykonujesz powyższą pętle i kiedy:
if( ((End - Start) / Frequency)%0.000005 == 0 )
{
\coś tam
}
Próbowałem przekombinować ten algorytm ale nie wiem dokładnie gdzie go podstawić. Poza tym kompilator wyrzuca mi błąd na operatorze "%"
MEA PULPA...
NIe przemyślałem, float nie dzieli się modulo...
Ale mój kod wygląd tak:
LARGE_INTEGER lpFrequency;
LARGE_INTEGER lpPerformanceCountStart, lpPerformanceCountEnd;
double Frequency;
double End;
double Start;
if (QueryPerformanceFrequency(&lpFrequency) != 0)
{
QueryPerformanceCounter(&lpPerformanceCountStart);
for (int i=0; ; i++)
{
QueryPerformanceCounter(&lpPerformanceCountEnd);
Application->ProcessMessages();
Frequency = lpFrequency.QuadPart;
End = lpPerformanceCountEnd.QuadPart;
Start = lpPerformanceCountStart.QuadPart;
int licz = int(((End - Start) / Frequency)*1000000);
Form1->Caption = licz;
if(licz%5==0)
{
//AKCJA!!
}
}
}
I chyba nawet powinien działać...]
PS> Form1->Caption = licz; ta linia jest tylko testowa i zostawiłem ją, żeby wizic dokładnośc... ale możesz spokojnie ją wywalić.