procedure DoSomething; var S: String; begin S := CalculateSomething; ShowMessage(S); Halt; end;
Ответ.
...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
procedure DoSomething; var S: String; begin S := CalculateSomething; ShowMessage(S); Halt; end;
Можно использовать некоторые HTML-теги, например:
<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>
Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.
Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.
Нет, если винда NT. А вот в 95 вроде могла память не освободиться, после Halt.
ОтветитьУдалитьHalt выполняет аварийное завершение программы, в этом основная проблема.
ОтветитьУдалитьТо что память строки не будет освобождена и цикл выборки сообщений будет остановлен неожиданно это уже мелочи.
Ну аварийное, и что с того?
ОтветитьУдалитьЕсли ShowMessage вернёт управление раньше, чем закроется, Halt её убъёт. У меня ещё никогда не возвращала, правда...
ОтветитьУдалитьТам, сразу апосля ShowModal стоит Free
ОтветитьУдалитьДобрый день! А не подскажете есть ли обратная совместимость у проектов d2007 и d2006?
ОтветитьУдалитьHalt вызывает ExitProcess, так что все должно закончиться хорошо.
ОтветитьУдалитьВот если бы вместо halt вызывался бы TerminateProcess - тут - да, могли бы быть проблемы, ведь второй, запустив механизм уничтожения, возвращает управление сразу же, в отличие от...
Если в CalculateSomething или ShowMessage (точнее в Application.OnModalBegin или Application.OnModalEnd) генерируется исключение, то Halt не выполнится.
ОтветитьУдалитьТакже обнаружил что, если в Application.OnModalBegin один раз генерируется исключение, то больше этот обработчик вызываться не будет. Наверное, надо было в TApplication.ModalStarted сначала вызывать FOnModalBegin(Self), а потом Inc(FModalLevel).
Halt - страшная вещь, т.к. отрабатывает секции finalization... Данный пример демонстрирует всю разрушительную мощь сторонних эффектов при использовании глобального контекста.
ОтветитьУдалитьА в многопоточных приложениях, желательно еще перекрывать ExceptProc(== SysUtils.ExceptHandler), дабы не словить волну странных ошибок в незавершенных потоках.
Для ответа на поставленный вопрос нужен код CalculateSomething.
ОтветитьУдалитьПодозреваю, что он порождает сто потоков, каждый из которых порождает сто процессов. Каждый из этих порожденных процессов смотрит, жив ли материнский процесс. Если нет, то каждый из этих потоков форматирует случайный логический диск. Поэтому кому-то, тому кто пока не собирается форматировать сотню случайных логических дисков на своем компьютере, может показаться, что проблемы в этом коде все-таки есть. Я бы рекомендовал такому осторожному человеку не спешить закрывать диалог в ShowMessage.
С другой стороны, автор кода явно хотел, чтобы после закрытия ShowMessage программа завершила работу. Однако, как GunSmoker показал в предыдущем посте, сам код ShowMessage (впрочем, как и любой другой) весьма легко может быть поставлен в невозможные условия работы, например, испорченным стеком или таблицей импорта. Поэтому, автору, возможно, следовало бы написать так:
ОтветитьУдалитьprocedure DoSomething;
var
S: String;
begin
S := CalculateSomething;
try
ShowMessage(S);
finally
Halt;
end;
end;