Как остановить цикл кнопкой стоп (без использования потоков)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
poiuyt555
новенький
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Как остановить цикл кнопкой стоп (без использования потоков)

Сообщение poiuyt555 »

Здравствуйте.
На форме есть кнопка пуск цикла и стоп. Потоки не используются.
Но кнопка стоп не нажимается, пока весь цикл не закончится.
Application.ProcessMessages; не помогло - оно только не дает возникнуть окну (не отвечает...), но кнопка на форме все равно нажимается только после окончания всего цикла.

Как сделать, чтобы можно было остановить цикл кнопкой стоп в такой ситуации?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение Padre_Mortius »

самый простой вариант это в цикл вставляете проверку переменной, значение которой меняется при нажатии на кнопку.
poiuyt555
новенький
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение poiuyt555 »

самый простой вариант это в цикл вставляете проверку переменной, значение которой меняется при нажатии на кнопку.

Я так и думал, но я пытался при нажатии на кнопку стоп менять капшион формы (для проверки - сработало нажатие или нет) и это не срабатывало.
Получается переменная изменится все равно?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение SSerge »

poiuyt555 писал(а):Application.ProcessMessages; не помогло


Оно ГДЕ применялось?
Управление на обработку сообщений придется передавать изнутри цикла, при этом вы серьезно задержите ваши расчеты.
И что-то мне говорит, что если цикл вызван из процедуры, привязанной к нажатию другой кнопки, то всё управление формой будет блокироваться, пока не будет произведен выход из уже задействованной процедуры-обработчика. М.б. и не прав, проверять на практике что-то неохота. :D

ps. Я бы посадил нужную кнопку на другую форму и запустил её перед входом в цикл в не-диалоговом режиме
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение Kemet »

Видимо, лучше всего будет повесить на таймер нужную процедуру, а на кнопки переключатель состояния (старт/стоп)
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение alexs »

Делаешь цикл:

Код: Выделить всё

stop:=false;
while not stop do
begin
  ----Тут твой код
  Application.ProcessMessages; //Это чтобы кнопка нажималась
end


В обработчике нажатия кнопки пишешь:

Код: Выделить всё

stop:=true;
poiuyt555
новенький
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение poiuyt555 »

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

Да так и есть, так и происходит.
Видимо надо использовать TThread. Другие варианты не совсем подходят.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение alexs »

Чтобы не блокировалось - надо Application.ProcessMessages !
poiuyt555
новенький
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

Re: Как остановить цикл кнопкой стоп (без использования пото

Сообщение poiuyt555 »

Чтобы не блокировалось - надо Application.ProcessMessages !

В итоге пока так и сделал, поставил Application.ProcessMessages в цикле в одно из условий (туда цикл заходит но не на каждой итерации).
Кнопка стоп заработала.
Ответить