2009-07-26 9 views
18

Mam program, który ma pewne problemy podczas zamykania, podnosząc wyjątki, których nie mogę śledzić z powrotem do ich źródła. Wydaje się, że jest to zależne od czasu i niedeterministyczne. Dzieje się tak, gdy wszystkie udostępnione zasoby zostały zwolnione, a ponieważ jest to wyłączone, wycieki pamięci nie stanowią problemu, więc zastanawiam się, czy istnieje jakiś sposób, aby po prostu powiedzieć programowi, aby natychmiast i cicho zakończył udostępnianie zasobów, zamiast Kontynuacja sekwencji zamykania i wyświetlenie okna komunikatu wyjątku.Jak można oczyścić program Delphi?

Czy ktoś wie, jak to zrobić?

+1

Jakim programem jest? Aplikacja na konsolę? W oparciu o aplikację? Próbujesz debugować/do/zamknięcia procesu? –

+0

Oparte na aplikacji, i tak, jestem, i to nie działa. Wydaje się, że jest to zależne od czasu, a debugger jest mniej lub bardziej bezużyteczny w tej aplikacji. Zobacz http://qc.embarcadero.com/wc/qcmain.aspx?d=76039 z tego powodu. –

Odpowiedz

18

Po przejrzeniu kodu źródłowego biblioteki czasu pracy Delphi oraz dokumentacji Microsoft; Potrafię potwierdzić komentarze Masona i Paula-Jana.

Hierarchia zamykania się następująco

Application.Terminate() 
    performs some unidentified housekeeping of application 
    calls Halt() 

    Halt() 
    calls ExitProc if set 
    alerts the user in case of runtime error 
    get rid of PackageLoad call contexts that might be pending 
    finalize all units 
    clear all exception handlers 
    call ExitprocessProc if set 
    and finally, call ExitProcess() from 'kernel32.dll' 

    ExitProcess() 
    unloads all DLLs 
    uses TerminateProcess() to kill the process 
+0

'TApplication.Terminate()' nie wywołuje 'Halt()'. Wywołuje listę procesów kończących, jeśli jest ustawiony, a następnie wysyła komunikat 'WM_QUIT' do kolejki komunikatów wątku wywołującego. Kiedy 'TApplication.Run()' odbiera 'WM_QUIT', przerywa swoją pętlę komunikatów i kończy pracę, powracając do głównego bloku kodu projektu, który następnie wychodzi, uruchamiając proces czyszczenia. –

4

Halt (0) był dobrym staroświeckim sposobem opowiedzenia programowi, aby zakończył się ze skutkiem natychmiastowym. Prawdopodobnie jest to teraz bardziej przyjazny dla Delphi, ale mam 95% pewności, że zatrzymanie (0) nadal działa. :-)

+1

To zdecydowanie działa, ale nadal będzie ładnie i czysto przetwarzać wszystkie części finlizacji i wyjścia. Jeśli któryś z nich wyzwala problem Masona, wciąż ma kłopoty. –

4

W przypadku, gdy HeartWare sugeruje użycie ExitProcess(), może to oznaczać, że korzystasz z bibliotek DLL, które nie reagują poprawnie na bibliotekę DLL_PROCESS_DETACH. W takim przypadku spróbuj użyć TerminateProcess (getCurrentProcess, 0);

Po zastosowaniu takich środków można się zastanawiać, czy "czysto" część tytułu tematu nadal pozostaje do kontroli.

+2

Och, mógł po prostu umyć ręce po wykonaniu tego - utrzymuje go w czystości! – Arafangion

1

Ostatnim razem, gdy musiałem upolować taki problem, zamykanie było przyczyną zdarzenia (zmiana rozmiaru - minęło trochę czasu), aby strzelić do umierającego okna, powodując próbę przerysowania czegoś, co wymagało rzeczy, które już były. zostały usunięte.

Powiązane problemy