[Delphi] Problem z wyjściem z aplikacji

0

Mam stworzony program, który wykonuje się automatycznie tzn. wiele zdarzeń jest zgłaszanych i wykonywanych. Najczęściej są tam czasowe pętle i cały cykl trwa około minuty. Mam zrobiony button wyjście, który powinien przerwac działanie aplikacji w dowolnym momencie, ale mimo Application.Terminate; nic się nie dzieje. Wychodzi dopiero po obsłużeniu wszystkich zadarzeń (komunikatów). Śledząc program widzę, że w zdarzeniu obsługi wyjścia przechodzi przez Application.Terminate; wykonuje end; i wraca do obsługi poprzedniego zdarzenia.

Jak przerwać działanie wszystkich nadrzędnych zdarzeń w jednej chwili?. Proszę o pomoc, bo już jestem zdesperowany walką z tym problemem ;-( ;-( ;-( help, help

JmP

0

myslę że powinieneś przed terminate dać coś w rodzaju

zakaczenie := true;

natomiast w pętli po Application.ProcessMessages

if zakaczenie then Exit ;

0

Tak w sumie mam zrobione, ale mam dużo zagnieżdżeń zdarzeń i nie zawsze są to pętle. Dla przykładu:

Zdarzenie1
begin
......
-> Zdarzenie2
...... begin
...... ........
...... ........
end; -> Zdarzenie3
........ begin
end; pętla
.......
end;

W zdarzeniu3 mam zrobione tak jak opisałeś, ale wejście w Zdarzenie3 ze Zdarzenia2 może nastąpić tak naprawdę w różnych momentach. Poza tym program jest bardzo robudowany i to wszystko nie jest takie prose. Dodam tylko tyle że tym ostatnim zdarzeniem (w przykładnie Zdarzenie3) jest obsługa portu szeregowego COM.

Może jest jakiś sposób na to aby w danej chwili nie wracał do poprtzednich zdarzeń, lub ustawił komunikat wyjścia na początek kolejki komunikatów, a nie na koniec tak jak to robi?

Może coś mi poradzisz, bo sprawa jest dla mnie bardzo ważna[code][/code][code][/code][code][/code]

0

Czy na tym forum naprawdę nie ma jakiegoś REKINA, który zmierzył sie z podobnym problemem?

JmP

0

Powinno działąć jeżeli w pętlach masz
Appliaction.ProcessMessages;
(a na pewno masz) dalej trzeba pod przycisk "Wyjście" wstawić
Przerwij:=True;
(Przerwij: Boolean; w private najlepiej), a w pętlach
if Przerwij then Break;
wtedy program wyskoczy z pętli pozostaje potem tylko go wyłączyć :)

Czyli tak samo jak pisał mirekpil i to musi dzialac nie ma ze boli ja wielokrotnie uzywalem tej metody na przerywanie petli i zawsze działało.

W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

0

No dobra, a pwiedz mi co w przypadku, gdy muszę zwolinić jakieś wykorzystywane zasoby (xxx.free), a trochę ich mam. Jak dam zwolnienie pod obsługą wyjścia, to zwolni zasoby, później jak będzie kończył pozostałe obsługi zdarzeń, to wjedzie na zwolniony zasób i się wywali. W sumie można zrobić jakieś warunki sprawdzające, ale to straszna robota w tym momencie. Naprawdę nie ma innego sposobu?

JmP

0

To moze by tak:

if Przerwij then
begin
Procedura_zwalniajaca_zasoby;
Break; Exit; albo Halt :)
end;

--
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

0

type
EEnd = class(TException);

procedure;
begin
try
raise EEnd
except EEnd
end;
end

KPW??

--
Vogel [Delphi 6 PE]

Life is just a dream, you know...
[Cowboy Bebop]

0

Na twoim miejscu przerobiłbym to na wątki. Wówczas nie ma praktycznie żadnego problemu z zatrzymaniem w dowolnym momencie.

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC:
Kanał: #4programmers.net
Serwer: warszawa.ircnet.pl
Sieć: POLNet
Port: 6667

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