Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

"Pętla" przez określony czas

thexaw 18 Paź 2010 20:57 1933 13
  • #1 18 Paź 2010 20:57
    thexaw
    Poziom 9  

    Mam program w C++, mniejsza o to co on robi, i mam w nim a'la petle:

    KROK1:
    coś tam
    IF .... THEN GOTO KROK2;
    ELSE GOTO KROK1;

    KROK2:

    Wszystko ładnie się pętli, i jeżeli IF się doczeka na warunek przeskakuje na KROK2: jeżeli nie czeka dalej, tylko teraz chodzi mi o to że jeżeli warunek w KROK1: nie zostanie spełniony przez np. minutę, lub po określonej liczbie cykli to żeby wykonało mi np. GOTO ERROR;

    0 13
  • #2 18 Paź 2010 21:15
    arnoldziq
    Moderator Programowanie

    W zależności od użytego języka programowania, masz co najmniej kilka rozwiązań.
    1. Komponent TTimer.
    2. Pętle odliczające czas.
    3. Pętle odliczające ilość uruchomień
    ... i wiele innych.
    Od ciebie zależy czego użyjesz lub/i wybierzesz.

    0
  • #3 18 Paź 2010 21:29
    thexaw
    Poziom 9  

    Problem własnie w tym że jestem na prawdę początkujący i wymyslanie ciężko mi idzie. Poza tym nie chciał bym używać LOOP, czy czegos podobnego tylko użyc tego co już jest...

    0
  • #5 19 Paź 2010 10:23
    thexaw
    Poziom 9  

    Jasne że to proste. Dla kogoś kto się w to bawi, a ja to robię z musu. Jak to by można zrobić to wymyśliłem, tylko za cholerę nie wiem jak to wpisać...

    0
  • #7 20 Paź 2010 13:01
    thexaw
    Poziom 9  

    Chyba mam. Zrobiłem coś takiego:

    Code:
    czekaj_do = Now()+EncodeTime((Word)StrToInt(0), (Word)StrToInt(0), (Word)StrToInt(30), (Word)StrToInt(0));
    
    KROK1:
    while (Now() > czekaj_do) goto ERROR;
    coś tam
    IF .... THEN GOTO KROK2;
    ELSE GOTO KROK1;

    KROK2:
    .......

    ERROR:


    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    0
  • #8 20 Paź 2010 17:49
    Dżyszla
    Poziom 42  

    Na litość, oducz się etykiet i instrukcji goto!

    Pierwsza pętla jest raczej idiotyczna - albo się wykona raz, albo wcale, czyli jak zwykły IF. Po drugie, to jeśli KROK1 jest początkiem pętli, to ta pętla while jednak kiedyś da poprawny wynik, a chyba nie chcesz ERROR wtedy wykonać?

    0
  • #9 20 Paź 2010 20:38
    thexaw
    Poziom 9  

    W sumie niby tak, jednak w moim konkretnym przypadku IF i tak musi wystąpić w ciągu max. 10 sekund albo w ogóle, więc akurat tutaj zdaje to egzamin. Musiałem wykryć przez LPT czy podłączony do nogi LED miga czy nie, no i sygnał z LEDA powinien się właśnie pojawić w ciągu tych max 10s. Jeżeli nie to znaczy że elektronika z ledem jest uwalona, więc jeżeli w ciągu tej pół minuty nic się nie pojawi na porcie to wywala ERROR jeśli się pojawi leci dalej. Co do mojego pisania "do o koła", to jak już wspominałem dopiero zaczynam z C++ i musze sobie jakoś radzić, nie mam pod ręką nikogo kto pokaże i zostaje internet i helpy.

    0
  • #10 26 Paź 2010 12:25
    Czebu
    Poziom 19  

    Dżyszla napisał:
    Na litość, oducz się etykiet i instrukcji goto!


    To nie jest tak do końca. Chodzi o to, że instrukcji goto używamy w ostateczności. Można jej użyć do wyjścia z mocno zagnieżdżonej pętli. W tym przypadku, goto używamy w ostateczności.

    0
  • #11 26 Paź 2010 12:41
    arnoldziq
    Moderator Programowanie

    piotr_kadlubowski napisał:
    To nie jest tak do końca. Chodzi o to, że instrukcji goto używamy w ostateczności. Można jej użyć do wyjścia z mocno zagnieżdżonej pętli. W tym przypadku, goto używamy w ostateczności.

    Pętle się "zagnieżdżają" właśnie przez używanie instrukcji goto. Zrezygnuj z nich kompletnie i zacznij używać funkcji i procedur.
    Jeżeli twój program utknie w którejś z nich, to tylko znaczy że masz jakiś błąd w kodzie.
    Używanie goto, prowadzi tylko do "zaciemnienia" kodu i straty czasu w przypadku potrzeby znalezienia błędu. Śledzenie takich skoków do różnych miejsc, to męka.

    0
  • #12 26 Paź 2010 17:53
    Dżyszla
    Poziom 42  

    @piotr - jeśli chcesz naprawdę wyskoczyć z jakiegos zaułka w programie, to wywołaj wyjatek, a cały blok obejmij sekcją przechwytywania wyjątków. GOTO nigdy mi nie było potrzebne i nigdy z niego nie skorzystałem przez 15 lat pisania programów (korzystałem tylko w Basicu na Commodore i w QBasicu na PC, nie wliczyłem do okresu ;) ).

    0
  • #13 26 Paź 2010 19:33
    thexaw
    Poziom 9  

    Zapomnijmy już o pętli bo jak dla mnie działa... Teraz pojawił mi się inny problem. Otóż po uruchomieniu programu całe okno jest zablokowane. Nie mogę nim ruszyć, nacisnąć innego przycisku, kompletnie nic dopóki program nie zakończy działania...

    0
  • #14 26 Paź 2010 19:48
    Dżyszla
    Poziom 42  

    Normalne. Jeśli zajmiesz główny wątek programu, to nie ma czasu na przetwarzanie komunikatów. Wyjściem pośrednim jest wymuszenie przetworzenia kolejki komunikatów (przykładowo w Delphi: Application.ProcessMessages). Jednak najlepiej byłoby stworzyć zasobożerny kawałek programu jako osobną procedurę, która będzie odpalana na odrębnym wątku.

    0
  Szukaj w 5mln produktów