delphi прервать выполнение процедуры

По нажатию кнопки устанавливай флаг и анализируй его в процедуре.А ты не можешь сразу задать правильный вопрос?

Андж wrote:> Можно подробнее об этом?Что «поподробнее»? Это готовая инструкция к действию, её нужно реализовать.Posted via ActualForum NNTP Server 1.4

Но выхода из процедуры не происходит.

Мда. Еще в школе, на корветах, загрузив с кассеты паскаль, у меня таких вопросов не возникало.

exit; — выходит из цикла.break; — прерывает цикл.

Допустим у меня на форме расположены две кнопки: Button1 — запуск цикла программы. Button2 — кнопка для останова программы.

Код кнопки Button1:

Как при нажатии, на вторую кнопку — остановить цикл программы?

Важное условие — мне нужно простое решение без использования потоков. Данный код не будет предназначен для работы в промышленных приложениях, так что подойдут и не самые «правильные» решения.

1 ответ 1

Итак, имеем форму с двумя кнопками StartButton & StopButton . Первая цикл запускает и выполняет, вторая останавливает.

Для контроля того следует ли остановить цикл в класс формы добавим булевую переменную-член класса (заменив ей ваш чекбокс, который не ясно зачем нужен).

Класс формы выглядит следующим образом:

Начнем с конца, кнопка стоп просто устанавливает флаг в значение true

Кнопка Старт же наоборот сначал сбрасывает значение в false , затем запускает бесконечный цикл. В цикле проверяя значение FStopped .

Что вообще тут происходит. При запуске приложения создается основной поток. В целом работа приложения представляет собой бесконечный цикл приема и обработки оконных сообщений, на этом основан весь принцип работы windows. В dpr-файле вы можете найти строку Application.Run , которая в этот цикл обработки и входит.

Когда в основном потоке вы начинаете писать какой-то ресурсоемкий код (например, бесконечный цикл), то ваше приложение перестанет обрабатывать эту очередь сообщений, не будет реагировать на движения мыши, не будет кликов по кнопкам, все остановится пока эта сложная задача не будет выполнена.

В связи с этим все ресурсоемкие задачи обычно выносятся в отдельные фоновые потоки, которые потом синхронизируются с главным, если это требуется.

Если же мы в наш бесконечный цикл добавим вызов Application.ProcessMessages() , это позволит приложению далее обрабатывать очередь входящих сообщений и соответственно реагировать.

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

Частенько функции несут в себе массивные вычисления или же большую группу действий. Согласитесь, что не всегда требуется выполнять функцию полностью.

Прерывание функции или процедуры Delphi

Так вот, сегодня я расскажу о том, как прервать выполнение функции в ходе работы программы. В общем виде это выглядит так:

Где это может пригодиться?

Представьте себе, что процедура сохраняет что-либо в файл. Перед сохранением логично было бы проверить, не собирается ли пользователь сохранить файл на компакт диск. Если это так, то нам лучше прервать процедуру, это поможет избежать ошибки. Также прерывание используют во время рекурсивного вызова функции.

Оцените статью