TTimer zmiana interval

0

Cześć.
Czy ktoś wie jak zmniejszyć czas tykania zegara (interval) na mniejszy - po niżej 1ms (chodzi mi żeby uzyskać około 500ns).

0

TTimer jest do tego najbardziej nieodpowiednim narzędziem... Tak naprawdę to nie zejdziesz poniżej ok 18/sek częstotliwości...

0

Potrzebuję wygenerować zegar wykorzystując linię DTR Coma. Timere uzyskałem najmniej 1ms. W jaki inny sposób mogę uzyskać taki czas (500 ns).

0

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)

0

[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!!

0

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ęć.)

0

po prostu wykonujesz powyższą pętle i kiedy:
if( ((End - Start) / Frequency)%0.000005 == 0 )
{
\coś tam
}

0

Próbowałem przekombinować ten algorytm ale nie wiem dokładnie gdzie go podstawić. Poza tym kompilator wyrzuca mi błąd na operatorze "%"

0

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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1