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

[Delphi] Jak stworzyć przycisk awaryjny do przerywania długich pętli?

marenc 24 Kwi 2008 18:11 2834 6
REKLAMA
  • #1 5072974
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Witam, pisząc program muszę wykorzystywać pętle wykonujące się bardzo długo ze względu na opóźnienia w tych pętlach.

    Chciałbym, abyście podpowiedzieli w jaki sposób mogę zrobić przycisk, który będzie np. wychodził z tych pętli. Podczas standardowego wykonywania pętli forma jest aktywna, ale nie pozwala ja dokonywanie na niej czynności(nic nie reaguje).

    Chciałem przerzucić dane z pętli do Timer'a ale okazało się, że wykonuje on je za wolno.

    Nie chciałbym angażować specjalnych modułów do wielowątkowych aplikacji.
  • REKLAMA
  • #2 5073408
    lepos
    Poziom 13  
    Posty: 82
    Pomógł: 5
    Przerwanie dlugiej petli przyciskiem mozna zrobic dajac jakas zmienna globalna np stop typu bool, ktora jest =0, jak masz petle for to pierwsze co ma byc sprawdzane to czy stop=0. Pod przyciskiem stopu dajesz instrukcje stop=1, wtedy zmienna sie zmieni i petla ominie wszystkie instrukcje pozostale bo if bedzie false. A przy jakims przycisku ktory ma uruchamiac petle wczesniej dajesz zerowanie tej zmiennej stop...
    czyli cos w stylu (nie pamietam jak tam sie w delphi pisze... wiec podam w C)
    
    bool stop=0;
    ..........
    int JakasFunkcja(){
    for(i=1;i<10000000;i++)
     if(stop==0){
           wszystie instrukcje petli
            }
    }
    .......
    void OnPressButtonStop(){        
    stop=1;
    }
    
    void OnPressButtonStart(){
    stop=0;
    JakasFunkcja();
    }
    

    Moze nie jest to najlepsze rozwiazanie ale w miare skutecznie dziala...
  • REKLAMA
  • #3 5073819
    dj_west
    Poziom 17  
    Posty: 109
    Pomógł: 24
    Ocena: 10
    A jak kolega ma wcisnąć ten przycisk, skoro aplikacja podczas wykonywania pętli nie reaguje na akcje użytkownika?

    Najlepszym jednak rozwiązaniem byłoby właśnie zastosowanie wątków. Wtedy pętla w wątku, a przycisk przerywa jej działanie.
  • REKLAMA
  • #4 5073886
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Chciałem odpisać, ale "Access to server denied"...

    Dokładnie jest tak jak pisze kolega "dj_west". Chciałem pętle dać do Timera i przyciski działały ... ale pętla w timerze dla interval 1 wolno działała.

    Teraz wpadłem na pomysł, aby odwrócić ... pętla normalnie, a w timerze dać obsługę wyjątku. Tylko jak w OnTimer sprawdzać klawiaturę lub myszkę?(to nie musi być przycisk na formatce, ale przycisk klawiatury lub myszki).
  • REKLAMA
  • Pomocny post
    #5 5073933
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #6 5073984
    dj_west
    Poziom 17  
    Posty: 109
    Pomógł: 24
    Ocena: 10
    Faktycznie, o tym zapomniałem. Zatem problem zdaje się być rozwiązany.
  • #7 5074055
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    No i ślicznie ... dzienx za pomoc "oloam" ;)

Podsumowanie tematu

✨ W dyskusji poruszono problem implementacji przycisku awaryjnego do przerywania długotrwałych pętli w aplikacji Delphi, gdzie standardowe pętle blokują interfejs użytkownika, uniemożliwiając reakcję na zdarzenia. Zaproponowano rozwiązanie polegające na wprowadzeniu globalnej zmiennej typu bool (np. stop), którą pętla sprawdza w każdej iteracji, a przycisk zmienia jej wartość, co pozwala na warunkowe przerwanie pętli. Podkreślono jednak, że podczas wykonywania pętli interfejs nie reaguje na zdarzenia, co utrudnia obsługę przycisku. Sugerowano użycie wielowątkowości, aby pętla działała w osobnym wątku, a interfejs pozostał responsywny. Autor próbował też przenieść pętlę do zdarzenia Timera, ale działanie było zbyt wolne. Ostatecznie rozwiązaniem okazało się wywołanie w pętli funkcji Application.ProcessMessages, która pozwala na przetwarzanie komunikatów systemowych i umożliwia obsługę przycisków podczas działania pętli. Dyskusja dotyczyła także możliwości wykrywania naciśnięć klawiszy lub myszy w Timerze, jednak nie podano konkretnego rozwiązania w tym zakresie.
Wygenerowane przez model językowy.
REKLAMA