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 przerwać odliczanie Timer1 przyciskiem zewnętrznym?

TomekMus 09 Sty 2012 08:27 1139 6
REKLAMA
  • #1 10370833
    TomekMus
    Poziom 17  
    Posty: 329
    Ocena: 7
    Jak wykonać coś takiego:

    Mam stoper który odlicza od 100 do 0 przy wykorzystaniu komponentu Timer1 z taktem co 1sek.

    (w form create przypisuje Liczba:=100;)

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    Czyli po odczekaniu 100sek program wykonan jakąś instrukcje.
    Chcę dodać do programu kolejny warunek czyli żeby z zewnątrz można było przerwać odliczanie 100sek do czasu wykonania "ZADANIA" poprzez przyciśnięcie przycisku. Mam takie urządzenie co monituje swój stan poprzez komende

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod


    finkcja ta zwraca "0" lub "1" w zależności czy został naciśnięty przycisk czy nie
    0 - nic
    1 - naciśnięto przycisk

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 10370887
    Vinnic
    Poziom 16  
    Posty: 158
    Pomógł: 18
    Ocena: 20
    Najprościej w zewnętrznym warunku daj Timer1.Enabled:=FALSE;. Spowoduje to zatrzymanie timera.
  • REKLAMA
  • #3 10371810
    TomekMus
    Poziom 17  
    Posty: 329
    Ocena: 7
    Próbowałem i nie działa poprawnie.
  • REKLAMA
  • Pomocny post
    #4 10371955
    Vinnic
    Poziom 16  
    Posty: 158
    Pomógł: 18
    Ocena: 20
    Nie rozumiem co może nie działać. Warunek zostaje spełniony i timer w tym momencie jest zatrzymany.
  • Pomocny post
    #5 10372656
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Niestety jeśli zajmiesz główny wątek, to Timer który z pewnością jest w nim zdefiniowany także nie będzie działał... Jeśli chcesz oczekiwać na coś w pętli - zdefiniuj to na osobnym wątku.
  • REKLAMA
  • #6 10373033
    TomekMus
    Poziom 17  
    Posty: 329
    Ocena: 7
    OK to zrobie tak że będe miał dwa wątki któty jedem będzie główny czyli ten co zlicza od 100 do 0 i kończy się jeśli licznik będzie równy zero i dodam dodatkowy parametr Koniec: Boolean

    Kod: Delphi
    Zaloguj się, aby zobaczyć kod

    Mam pytanie czy zmienna Koniec muże być zwykłą zmienną czy musi być obiektową jeśli odwołują się dwa różne wątki do tej samej zmiennej?
  • #7 10373311
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Może być zwykłą, ale powinna być chroniona przez któryś z mechanizmów dostępu wielowątkowego. Aczkolwiek jeśli tylko jeden będzie czytał, a jeden będzie ją zapisywał, to można w takiej sytuacji zignorować to podejście.

Podsumowanie tematu

✨ W dyskusji poruszono problem przerwania odliczania timera w aplikacji Delphi przy użyciu komponentu Timer1. Użytkownik chciał dodać możliwość zatrzymania odliczania 100 sekund poprzez naciśnięcie zewnętrznego przycisku, który monitorowany jest za pomocą funkcji IOPort.GetLine. Uczestnicy dyskusji zasugerowali, aby zatrzymać timer poprzez ustawienie Timer1.Enabled na FALSE w odpowiednim warunku. Zwrócono uwagę, że jeśli główny wątek jest zajęty, timer nie będzie działał, dlatego zalecano użycie dwóch wątków. Użytkownik zapytał, czy zmienna kontrolująca zakończenie odliczania (Koniec) może być zwykłą zmienną, na co odpowiedziano, że może, ale powinna być chroniona w kontekście dostępu wielowątkowego.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA