Подтвердить что ты не робот

Как вы полностью прервите программу Delphi?

У меня есть программа, которая имеет некоторые проблемы во время выключения, что вызывает исключения, которые я не могу отследить до их источника. Похоже, что он связан с хронометром и не является детерминированным. Это происходит после того, как все разделяемые ресурсы были выпущены, и поскольку это завершение работы, утечки памяти не являются проблемой, поэтому меня удивляет, есть ли способ просто сказать программе немедленно прекратить работу и освободить разделяемые ресурсы вместо продолжая последовательность выключения и предоставляя сообщение об ошибке.

Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 1

После просмотра исходного кода библиотеки времени Delphi и документации Microsoft; Я могу подтвердить, что Мейсон и Пол-Ян комментируют.

Иерархия выключения выглядит следующим образом

  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

Ответ 2

ExitProcess (0)?

Ответ 3

Halt (0) раньше был добрым старомодным способом сказать программе, чтобы она закончилась с немедленным эффектом. Вероятно, теперь есть более удобный для Delphi способ сделать это, но я на 95% уверен, что остановка (0) все еще работает.:-)

Ответ 4

Если предложение HeartWare об использовании ExitProcess() не удастся, возможно, вы используете некоторую DLL, которая не отвечает на DLL_PROCESS_DETACH. В этом случае попробуйте использовать TerminateProcess (getCurrentProcess, 0);

Как только вы прибегаете к таким мерам, можно задаться вопросом: "чисто" часть названия темы по-прежнему подходит для проверки.

Ответ 5

В прошлый раз, когда мне приходилось искать такую ​​проблему, выключение было причиной того, что событие (изменение размера?) прошло некоторое время.), чтобы выстрелить в умирающее окно, что привело к попытке перерисовать что-то, что требовало того, что уже было удаляется.