[c++] [vs] pętla w roli SetTimer'a

0

Witam
Muszę napisać funkcje, która w pętli będzie podawała mi wartości pośrednie między liczba1 a liczba2 z wybraną dokładnością oraz aby czas między podawaniem wartości pośrednich był edytowany i zawierał się między 1ms -20ms. Wykonanie pętli powinno zajmować około 0.5 - 3 sek. I mam problem z tym, że opóźnienie między kolejnymi wartościami tworzy pusta pętla.
A absolutnie nie mogę sobie pozwolić na to żeby przez ten czas kilku sekund aplikacjia była "zawieszona".

dla uproszczenia załóżmy, że liczba1 zawsze jest mniejsza od liczba2: np:

int liczba1 = 10;
int liczba2 = 300;
int dokładność = 5;

void wartosciPosrednie(liczba1, liczba2, dokladnosc, szybkosc)
{

for (liczba1 ; liczba1 < liczba2 ; liczba1+= dokladnosc)
{
cout << liczba1;

//tutaj jakis sposob na okreslenie czasowe (1-20ms) jakis timer
//ale bardzo zależy mi na tym aby ten czas odmierzany był dokładnie
[b]//pętla for nie moze byc ale musi byc na innym wątku bo na ten czas zawiesza aplikacje
//a tego oczywiscie muszę uniknąć[/b]

}

}

piszę aplikacje w czystym api i mfc i jeśliby użyc funkcji

UINT_PTR SetTimer(
   UINT_PTR nIDEvent,
   UINT nElapse,
   void (CALLBACK* lpfnTimer
)

chciałbym ją uruchomić w tej funkcji powyżej, ale nie wiem jak zrobić, aby po czasie zależnym od ( nElapse ; Specifies the time-out value, in milliseconds. ) moja pętla dalej wykonywała obliczenia. Może po prostu nie wiem jak tego poprawnie użyć.. bo pośrednie wartości mogą być obliczane i wypisywane w funkcji, która będzie wywoływana jedynie tylko co pełne odliczenie Timera(a nie będzie wisiała aż do końca pętli). Może to nie będzie zawieszało aplikacji. Takie coś mam w mikrokontrolerze i to sie nazywa przerwanie od licznika :) jak to osiągnąć w moim przypadku?
Dziękuje z góry za jakiekolwiek wskazówki.

0

Funkcja SetTimer wymaga by wątek który jej używa miał pętlę komunikatów (GetMessage).

Funkcja timeSetEvent (dostępna od win98) tego nie wymaga, a na dodatek potrafi przekazać dowolny parametr do docelowej funkcji którą będzie periodycznie lub jednorazowo uruchamiać i myślę że takiej funkcji szukasz. Fraza której potrzebujesz dla wyszukiwarki totimeSetEvent +TIME_CALLBACK_FUNCTION +TIME_PERIODICPamiętając że timer wyłącza się funkcją timeKillEvent. Funkcja timeSetEvent ma też lepszą rozdzielczość (minimum 1ms) i lepszy priorytet od szarego timera SetTimer.

0
sapero napisał(a)

Funkcja timeSetEvent
toż to jakaś egzotyczna funkcja z "Window Media", dostępna dopiero od winxp.
Lepiej użyć jakiś tradycyjny mechanizm.

@puntigamer: Masz i okienka MFC i konsolę?

Co chcesz dokładnie zrobić z tą liczbą co określony okres czasu? Przy takiej rozdzielczości (średnio 10ms) nie zdążysz jej nawet wyświetlić w konsoli.

Opisz ogólniej całą ideę.

0

Cześć.
Nie, robię wszystko pod MFC :) skrótowo napisałem, że cout, aby nie mącić. Czasy potrzebne mi są do komunikacji po RS.
Tamto rozwiązałem uruchamiając Timera, który przeliczał wartości pośrednie między liczba1 a liczba2 co przepelnienie licznika i od razu wysyłał. Zastosowałem Timer co 20ms. Uruchomienie licznika w funkcji "PrzygotujDane" . Przeliczanie danych i wysyłanie w OnTimer().

teraz mam ciekawszą sprawe do rozwiązania.
mam tablice danych. chce pobierac za każdym razem jednorazowo jeden wiersz, wykonam na danych z tego wiersza pewne działania (zajmie mi to nawet 5 sekund). Czas na jaki chce się tu zatrzyamc powinien wlasnie byc odmierzany w Timerze.
Następnie po przepełnieniu Timera (przykladowo te 5 sek) chciałbym jakoś wrócić do wykonywania funkcji odpowiedzialnej za czytanie nastepnego wiersza z tabeli.

macie jakieś pomysły? Chcę zastosować SetTimer, KillTimer, ale pewnie trochę w innej formie

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