Witam,
Mam mały problem z Timerem. Mój program gromadzi dane z pewną częstotliwością (stąd konieczność użycia Timera) jednak praca Timera odbywa się w tle, tzn. program nie czeka na zebranie danych, tylko odpala Timer i "leci" dalej do kolejnych procedur i liczy, podczas gdy dane nie zostały jeszcze pobrane. Czy ma ktoś może pomysł co z tym zrobić? Może istnieje jakiś prosty sposób by Timer nie działał w tle, a kolejne procedury czekały, aż on skończy pracę? Będę wdzięczny za wszelkie sugestie.
Serdecznie pozdrawiam.
W procedurze po wykonaniu odpowiednich operacji uruchom Timer'a
Timer.Enabled := True;
a w OnCreate formy wsadz
Timer.Enabled := False;
Timer po uruchomieniu nie bedzie dzialal, a kiedy dana procedura zakonczy dane operacje wlacza timer'a (dlatego linia kodu odpowiedzialna za wlaczenie timera powinna byc jako ostatnia ze wszystkich w procedurze)
Chyba trochę za bardzo zamieszałem i się nie zrozumieliśmy albo ja nie rozumiem:)
Spróbuję problem przedstawić nieco inaczej.
Opis ideowy programu:
- .......
- procedura.1 -> Pobierz dane, Timer.Enabled:=True, pobieram np. 100 próbek, Timer.Enabled:=False;
- procedura.2 -> Policz, korzystając z danych z danych z p. 2.
- ........
Problem polega na tym, że program zasuwa i zanim zdąży zgromadzić dane (p.2) on już liczy (p.3) i oczywiście wychodzą głupoty. Idealnie byłoby jeśli udałoby się wstrzymać procedurę.2 aż zakończy pracę procedura.1, albo wstrzymać pracę samej procedury zaraz po wywołaniu funkcji Timer do czasu zebrania danych, a następnie pościć ją dalej.
Serdecznie pozdrawiam.
no ta ja to widzę tak (w pseudokodzie):
procedura Rozpocznij:
NrPomiaru := 0
włącz timer (i tylko tyle)
procedura Timer1OnTimer:
zwiększ(NrPomiaru)
dokonaj pomiaru
if (NrPomiaru) = 100 then
wyłącz timer
PrzetwórzDane
procedura PrzetwórzDane
coś tam rób z zebranymi pomiarami
dodaj zmienną koniec typu boolean tak by była globalnie dostępna. Przed
Timer1.Enabled:=true;
daj koniec:=false;
w ostatnie linii procedury timera dodaj <code class="delphi">koniec:=true;
w procedura.3 dodaj coś takiego
while not koniec do ;
Witam, w tym przypadku sensowne zdaje się wykorzystanie wątku, który będzie przeliczał zebrane dane, w timerze uruchamiasz procedure pobierającą dane a na końcu procedury pobierającej odpalasz wątek co "mieli" te dane.
Pozdro hej