Problem z Timerem

0

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.

0

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)

0

Chyba trochę za bardzo zamieszałem i się nie zrozumieliśmy albo ja nie rozumiem:)
Spróbuję problem przedstawić nieco inaczej.

Opis ideowy programu:

  1. .......
  2. procedura.1 -> Pobierz dane, Timer.Enabled:=True, pobieram np. 100 próbek, Timer.Enabled:=False;
  3. procedura.2 -> Policz, korzystając z danych z danych z p. 2.
  4. ........

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.

0

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
0

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 ;
0

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

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