Zamknięcie aplikacji

0

Witam.
Może problem błahy, ale jakoś dziwnie mi działa. Może kawałek kodu na początek.

...
username := GetUserFromWindows;

query := 'select ID from studenci where NrIndeksu = ' + chr(39) + username + chr(39) + ' and Filled = ' + chr(39) + '0' + chr(39);

ADOQuery1.Active := False;
ADOQuery1.SQL.Add(query);
ADOQuery1.Active := True;
if ADOQuery1.RecordCount = 1 then
  idstudent := ADOQuery1.Recordset.Fields.Item[0].Value
else
  Application.Terminate;
...

Wszystko w porządku warunek nie spełniony przechodzi do Application.Terminate. Ale nie zatrzymuje się na tym, znaczy aplikacja się nie zamyka, tylko przechodzi dalej jak gdyby nigdy nic. Jak poprawnie zamknąć aplikację? Dodam, że jest to w sumie początek funkcji FormCreate.

0

Nie znam się, ale jakbyś dał pod else?

else begin
  Application.Processmessages;
  Application.Terminate;
end;

Albo w innym miejscu, np. nad else.

0

Niestety. Nie działa.

0

Application.Terminate z jakiegoś powodu dojdzie do końca. To, co chcesz uzyskać uzyskasz za pomocą HALT.

0

Halt powoduje wycieki pamięci !

0
Opi napisał(a)

Halt powoduje wycieki pamięci !

No to zaproponuj coś innego sensownego.

Ja w takich sytuacjach(gdy muszę zakończyć w OnCreate lub onShow) wywołuję sobie metodę, w której zwalniam wszystkie wcześniej utworzone obiekty i robię halt.

0

hmm...:

procedure TApplication.Terminate;
begin
  if CallTerminateProcs then PostQuitMessage(0);
end;

[...]

function CallTerminateProcs: Boolean;
var
  PI: PTerminateProcInfo;
begin
  Result := True;
  PI := TerminateProcList;
  while Result and (PI <> nil) do
  begin
    Result := PI^.Proc;
    PI := PI^.Next;
  end;
end;

jak dla mnie to jakas funcja Ci blokuje proces zamykania programu. zobacz: http://4programmers.net/Delphi/Callterminateprocs
program sie nie zamknie jesli ktoras funkcja z listy zwroci false.
sprobuj samego PostQuitMessage(0) lub wyslij do siebie komunikat WM_QUIT to sie okaze gdzie lezy problem...

0
Opi napisał(a)

Halt powoduje wycieki pamięci !
od kiedy zakończony proces może mieć wycieki pamięci?

0

a na starszych systemach?

0

chyba tylko windows do Me włącznie i tylko przypadkiem. a jeśli masz na myśli DOS, to tam nie ma rezerwowania pamięci (poza tsr), bo nie ma systemowego managera pamięci, pozostają uchwyty do plików. *nix o ile w ciągu ostatnich kilku setek lat był upgrade'owany również nie ma z tym problemu.
owszem, reguły ying-yang wymagają grzecznego posprzątania po sobie i ukłonienia się gospodarzowi, ale potem i tak przyjedzie buldożer (który co prawda nie posprząta po sterownikach, ale to imho temat na inny wątek).

0

bo nie ma systemowego managera pamięci, pozostają uchwyty do plików

które halt powinien zwolnić.
zauważcie, że sekcje FINALIZATION unitów się uruchamiają nawet podczas halt. czyli to nie jest tylko natychmiastowe zabicie własnego procesu. wystarczy że unit system

 będzie miał zwolnienie wszystkiego w finalization.
0
Azarien napisał(a)

bo nie ma systemowego managera pamięci, pozostają uchwyty do plików

które halt powinien zwolnić.
zauważcie, że sekcje FINALIZATION unitów się uruchamiają nawet podczas halt. czyli to nie jest tylko natychmiastowe zabicie własnego procesu. wystarczy że unit system

 będzie miał zwolnienie wszystkiego w finalization.



 > ##### ŁF napisał(a)
> a jeśli masz na myśli <b>DOS</b>, to tam nie ma rezerwowania pamięci (poza tsr), bo nie ma systemowego managera pamięci, pozostają uchwyty do plików

Czytaj uważnie!

Finalization nie wykona się przy zabijaniu procesu, bo nie wykona się nic. Odróżniasz zamknięcie/zakończenie procesu od jego zabicia?
0
ŁF napisał(a)

Finalization nie wykona się przy zabijaniu procesu, bo nie wykona się nic.

Finalization wykona się przy halt. Więc halt nie jest zabiciem. Zatem nie powinno być problemów z wyciekami, zwłaszcza że
· mamy nad tym kontrolę, możemy dorzucić własny kod podczas halt
· system operacyjny (wliczając w to DOS-a) i tak zwolni to co zostanie do zwolnienia, wliczając otwarte pliki (ale ich bufory niekoniecznie zostaną zrzucone, wciąż może dojść do utraty danych)

0

Zawsze można użyć Winexec(Pchar('taskkill -f -im ' + extractfilename(application.exename)), SW_HIDE); System wtedy zajmie się za zabicie procesu, wyłączenie programu.

0

Proponuje żebyś dodał do aplikacji TTimer.
W obsłudze zdarzenia OnTimer wpisz Application.Terminate;
A wyzwalasz timer w swojej procedurze.

0
RTS napisał(a)

Proponuje żebyś dodał do aplikacji TTimer.
W obsłudze zdarzenia OnTimer wpisz Application.Terminate;
A wyzwalasz timer w swojej procedurze.
jak już tak po bandzie jedziemy, to może lepiej dodać przycisk, który stworzy wątek, który stworzy timer, który wywoła terminate? [glowa]

0
ŁF napisał(a)

jak już tak po bandzie jedziemy, to może lepiej dodać przycisk, który stworzy wątek, który stworzy timer, który wywoła terminate? [glowa]

Proponuję dodać ubicie procesu do systemowego harmonogramu zadań.

// czy ja wiem... może lepiej w rejestrze dodać do RunOnce wpis, żeby po restarcie systemu zamknął ten proces? 100% skuteczności - Ł

0

nie no bez żartów Panowie. to bez sens i kobinowanie. Lepiej wywołać

Winexec(Pchar('taskkill -f -im ' + extractfilename(application.exename)), SW_HIDE);
application.termiante;

i system zamknie program. Też miałem sytuacje że Delphi nie chciał mi zamykać programu, więc używalem tego i mnie nie zawiodlo.

0
Legalnl napisał(a)

nie no bez żartów Panowie. to bez sens i kobinowanie. Lepiej wywołać

Winexec(Pchar('taskkill -f -im ' + extractfilename(application.exename)), SW_HIDE);
application.termiante;

i system zamknie program. Też miałem sytuacje że Delphi nie chciał mi zamykać programu, więc używalem tego i mnie nie zawiodlo.

jak sam powiedziales: bez zartow.

0

Pff co Ci w tym nie pasi? na pewno lepsze niż tworzenie jakis wątków czy jeszcze bardziej jakiś timerów no bez jaj, zaniedługo żęby wyłączyc program to będą komponenty sciągać. takie programowanie jak domek z kart...

0

ŁF i Azarien napisali ironicznie jakie inne glupie rozwiazania moznaby zastosowac, a Ty dodales nastepne.
a co mi nie pasuje? to ze uruchamiasz program ktory wywola pewna funkcje z systemowej biblioteki. mozna wywolac ja samemu efekt bedzie dokladnie ten sam.

a tak poza tym to: bardziej "pro" jest znalezienie bledu, dlaczego program nie zamyka sie od app.temrinate, a nie zabijanie procesu na sile.
dlatego napisalem wyzej czemu application.temrinate moze nie dzialac i gdzie szukac przyczyny.

0

@lega1n1
winexec ;] to jest dopiero pro! i application.termiante. to dla hiszpańskich systemów?

wiesz co to ironia?

@cimak - temrinate - to z kolei na ruski windows? (wybacz, ale nie mogłem sobie darować)

0

Application.Terminate nie zawsze zadziała od razu, tzn. jeśli np. wywołane w OnCreate, najpierw wykona się reszta instrukcji w onCreate, a czasem i jeszcze onShow. Po czym aplikacja się zamknie. Dlatego obstaję przy Halt, który zamknie aplikację natychmiastowo. Przed wywołaniem Halt dobrze jest pousuwać wszystkie utworzone obiekty.

0

dalem przyklad juz musza sie przypierpzac eeh. CIekawe czy rozwiązania innych były ciekawsze co?

0

Legalnl

Twoje posty są traktowane poważnie, Każda wskazówka jest cenna. :)
Nie ma co się napinać.

BTW: Halt;

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