logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak stworzyć procedurę opóźnienia 10ms w VB6 niezależnie od sprzętu?

viayner 13 Paź 2007 20:43 2572 13
REKLAMA
  • #1 4375849
    viayner
    Poziom 43  
    Posty: 10619
    Pomógł: 1561
    Ocena: 2039
    Witam,
    poszukuje rozwiazania nastepujacego problemu: w VB6 potrzebuje miec procedure ktora bedzie generowala kontrolowane opoznienie o zadanej wielkosci np. 10ms niezeleznie od tego na jakim komputerze to bedzie uruchomione. Czy ktos spotka sie z rozwiazaniem takiego problemu ?
    Pozdrawiam
  • REKLAMA
  • REKLAMA
  • REKLAMA
  • #4 4381350
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Musisz pamiętać o tym, że nie jest to proste ponieważ komputer wykonuje również inne czynności i kiedy naprzykład będzie przechwytywał dane z dysku lub wykonywał inne zadanie systemowe o najwyższym priorytecie to niestety twój programik będzie musiał poczekać. Co napewno przeszkodzi w odliczaniu idealnego czasu.

    pozdr.
  • REKLAMA
  • #5 4383336
    viayner
    Poziom 43  
    Posty: 10619
    Pomógł: 1561
    Ocena: 2039
    Witam,
    wlasnie w tym problem, potrzebuje petle ktora mi odliczy zadane opoznienie ale nie wstrzyma aplikacji bo cos innego dalej sie wykonuje. Dokladnosc nie musi byc 100% ale dobrze by bylo aby to bylo sensownej wartosci.
    Mam jeszcze pytanie dodatkowe - czemu nie chodzi mi kontralka Timer jezeli wywolam petle For, jezeli uruchomie petle i chce w petli odczytac wartosc Timera to zawsze jest 0.
    Pozdrawiam
  • #6 4385493
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    1.Potrzebujesz raz opóźnić jakąś czynność o dany czas czy ma to być pętla?

    2.Kontrolka Timer generuje zdarzenie i tam odczytujesz wartość.

    3.Pętla bez "DoEvents" nie przekaze żadnej wartości z systemu ponieważ system jest wstrzymany przez pracę twojego programu.

    pozdr
  • #7 4386784
    viayner
    Poziom 43  
    Posty: 10619
    Pomógł: 1561
    Ocena: 2039
    Witam,
    potrzebuje miec procedure ktora moge wywolywac z parametrem-czas opoznienia, wartosci opoznienia rzedu 1-10ms. Procedura chodzi w glownej petli programu poniewaz musze czekac zadany czas po wyslaniu danych na port.
    Myslalem o czyms w rodzaju wlasnie timera i petli uruchomionej raz na poczatku programu ktora wyliczy mi wartosc X do petli For a=0 to X, next a dla powiedzmy 1ms i dalej bede uzywal petli for z znana juz wartoscia nie jest to moze super dokladne ale bledy rzedu +20% mi nie szkodza, raczej odliczany czas nie powinien byc krotszy.
    Czy moglbys mi podac jakis przykladowy kod.
    Pozdrawiam
  • #8 4386916
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Proponuje Żebyś zainteresował sie co zwraca funkcja (nie kontrolka) "Timer" oraz podnoszeniem priorytetów programów w systemie (tylko nie za wysoko) :)

    pozdr.
  • #9 4386941
    aligatormp
    Poziom 14  
    Posty: 99
    Pomógł: 10
    Ocena: 7
    PC wyposażony jest w licznik, który z chwilą uruchomienia rusza od zera i jest inkrementowany przez generator. Aktualną wartość licznika można sczytywać funkcją API QueryPerformanceCounter(addr na zmienną 64bit) jak i częstotliwość inkrementacji QueryPerformanceFrequency(addr na zmienną 64bit). Licznik jest 64 bitowy. Na tych funkcjach zrobiłem pętlę ok 1,75ms.

    Pozdrawiam.
  • #13 4389868
    aligatormp
    Poziom 14  
    Posty: 99
    Pomógł: 10
    Ocena: 7
    Ciekawy przykład liczący czas w VB zapewne do Ci pogląd na wykorzystanie tych funkcji. Nie znam VB dlatego nie podam Ci kodu.
    Pętla powinna wyglądać następująco.

    ;inicjalizacja
    QueryPerformanceFrequency liFreq odczytujesz częstotliwość inkrementacji licznika, jeśli zwraca NULL system nie obsługuje licznika.

    ;start
    QueryPerformanceCounter liStart odczytujesz początek zliczania, liStop=liStart +(liFreq*czas)

    repeat
    odczytujesz QueryPerformanceCounter liVal
    until liVal>=liStop

    Pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy stworzenia w Visual Basic 6 procedury generującej kontrolowane opóźnienie rzędu 10 ms, niezależnie od sprzętu, bez blokowania całej aplikacji. Standardowa funkcja Sleep nie spełnia wymagań, ponieważ zatrzymuje cały program. Proponowane rozwiązania obejmują wykorzystanie pętli opóźniającej z wywołaniem DoEvents, aby umożliwić wykonywanie innych zadań systemowych, oraz użycie funkcji API Windows: QueryPerformanceCounter i QueryPerformanceFrequency, które odczytują wysokorozdzielczy licznik sprzętowy do precyzyjnego odmierzania czasu. Timer w VB6 generuje zdarzenia, ale w pętli For jego wartość nie jest aktualizowana bez DoEvents. Podniesienie priorytetu procesu może poprawić dokładność, jednak systemowe zadania o wysokim priorytecie mogą wprowadzać opóźnienia. Przykładowa pętla opóźniająca polega na odczycie częstotliwości licznika, zapamiętaniu wartości startowej i oczekiwaniu w pętli aż licznik osiągnie wartość odpowiadającą żądanemu czasowi opóźnienia. Dokładność rzędu ±20% jest akceptowalna, a opóźnienie nie powinno być krótsze niż zadane. Linki do przykładów i dyskusji na temat implementacji w VB6 zostały udostępnione.
Wygenerowane przez model językowy.
REKLAMA