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

Zegar w Delphi. Zmiana czasu zadziałania operacji.

Druss21 30 Lis 2006 13:14 2961 5
REKLAMA
  • #1 3278940
    Druss21
    Poziom 18  
    Posty: 322
    Pomógł: 21
    Ocena: 2
    Mam problem ktory polega na tym ze mam zmienic czas zadzialania operacji, jaka jest zapalenie sie np swiatla. Mam to zrobic tak zeby sie zaczelo po 3s od startu. Nie moge uzyc sleep, dlatego pytam o te zdarzenia zegarowe, w delphi jest podobno ustawione co 200ms, jak to zmienic ??
  • REKLAMA
  • #2 3279071
    eit
    Poziom 17  
    Posty: 304
    Pomógł: 1
    Ocena: 53
    Użyj komponentu Timer. Wstawiasz go na formę, ustawiasz mu czas na 3000 (3000ms=3s), włączasz go (np. Enable=true) A w zdarzeniu OnTimer najlepiej zatrzymać timer czyli enable = false i umieszczasz polecenia jakie mają się wykonać po tych 3 sekundach.
    Przynajmniej ja bym zrobił cos takiego w Builderze C++ :) ale w Delphi będzie podobnie.
  • REKLAMA
  • #3 3279161
    Druss21
    Poziom 18  
    Posty: 322
    Pomógł: 21
    Ocena: 2
    Tam w Delphi jest taki obiekt Timer, ma ustawiony Interval na 200. Tylko chodzi o to zeby to jakos zapisac a nie zmienic na 3000. Np jak 15 razy zliczy to wtedy ma uruchomic to co chce, takie opoznienie przez zliczanie cykli.
  • REKLAMA
  • #4 3281937
    eit
    Poziom 17  
    Posty: 304
    Pomógł: 1
    Ocena: 53
    Ja bym to zrobił jak wcześniej napisałem, ale można też powiedzmy jak ty chcesz (poniżej program pisany z palca w Builder C++, w Delphi będzie podobnie):

    Timer1->Interval = 200 ;
    int zadanie = 0 ;
    Timer1->Enabled = true ;

    i w zdarzeniu obsługi Timera:
    {
    zadanie++
    switch(zadanie){

    case 1:
    //wykonaj polecenie nr1
    break;

    case 2:
    //wykonaj polecenie nr2
    break;

    case 3:
    //wykonaj polecenie nr3
    break;

    //(...)

    case 15: // wykonanie po 3s
    //polecenie nr 15
    break;
    }
    }

    zadziała to tak że co 200ms będzie wykonywane polecenie : przy case 1, potem case 2 itd.


    lub prościej w obsłudze OnTimer
    zadnie++
    if (zadanie==15)
    {
    //wykonaj coś
    }


    Ostatnio właśnie robiłem program w którym musiałem wysyłać do sterownika po RS232 zapytania, ale aby nie "zapchać" sterownika zapytanie co 100ms.
    wyglądało to mniej więcej właśnie jak powyżej w 1 przykładzie gdzie case 1, case 2, case 3 ... to było wysłanie odpowiedniego polecenia- zapytania do sterownika (funkcja wykonująca zapis do Portu RS).

    pozdro
  • REKLAMA
  • #5 3284228
    Druss21
    Poziom 18  
    Posty: 322
    Pomógł: 21
    Ocena: 2
    Ja zrobilem cos takiego, przykladowo dla 10sekund.

    licznik:=licznik+1;

    if licznik>50 then
    begin
    zapalenie swiatla
    end;

    Problem jest w tym ze wiem jak wyzerowac licznik ale gdziekolwiek go wpisze jest caly czas zero i swiatlo gasnie. Zeruje licznik poleceniem licznik:=0. Drugi problem to ze to zliczanie zaczyna sie z startem programu czyli jak zaktyje po 2 sekundach fototranzystor to zapali sie po 8, a jak powyzej 10s to zapali sie natychmiastowo. Jesli dam if licznik = 50 to swiatlo mignie tylko w czasie 10s.
  • #6 3293118
    eit
    Poziom 17  
    Posty: 304
    Pomógł: 1
    Ocena: 53
    Druss21 napisał:
    Ja zrobilem cos takiego, przykladowo dla 10sekund.

    licznik:=licznik+1;

    if licznik>50 then
    begin
    zapalenie swiatla
    end;

    Problem jest w tym ze wiem jak wyzerowac licznik ale gdziekolwiek go wpisze jest caly czas zero i swiatlo gasnie. Zeruje licznik poleceniem licznik:=0. Drugi problem to ze to zliczanie zaczyna sie z startem programu czyli jak zaktyje po 2 sekundach fototranzystor to zapali sie po 8, a jak powyzej 10s to zapali sie natychmiastowo. Jesli dam if licznik = 50 to swiatlo mignie tylko w czasie 10s.


    Nie wiem dokładnie co chcesz osiągnąć, co ma robić program itd.
    Apropo tej zmiennnej licznik upewnij się czy to zmienna lokalna czy globalna czyli nie ma jakiegoś przesłaniania się. Ja bym dał zmienną globalną w tym przypadku.
    Zaliczanie czyli start timera (Timer1->Enabled =true) nie musi być przecież z momentem startu programu. W komponencie Timer1 ustawiasz mu na false, ale timer możesz sobie potem uruchamiać jakimś przyciskiem czy podwójnym kliknięciem na jakimś panelu, itd (czyli w obsługę przycisku dajesz Timer1->Enabled =true).

    I wypadało by w którymś momencie zatrzymać timer, zresetować licznik i np. zacząć cykl od początku. U ciebie timer chyba działa w nieskończoność.
REKLAMA