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

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

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

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

Сообщение poiuyt555 » 23.02.2013 15:44:23

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

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

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

Сообщение Padre_Mortius » 23.02.2013 15:47:56

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

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

Сообщение poiuyt555 » 23.02.2013 17:55:11

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

Я так и думал, но я пытался при нажатии на кнопку стоп менять капшион формы (для проверки - сработало нажатие или нет) и это не срабатывало.
Получается переменная изменится все равно?
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение SSerge » 23.02.2013 18:20:39

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


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

ps. Я бы посадил нужную кнопку на другую форму и запустил её перед входом в цикл в не-диалоговом режиме
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение Kemet » 23.02.2013 19:19:15

Видимо, лучше всего будет повесить на таймер нужную процедуру, а на кнопки переключатель состояния (старт/стоп)
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

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

Сообщение alexs » 23.02.2013 21:48:38

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


В обработчике нажатия кнопки пишешь:
Код: Выделить всё
stop:=true;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение poiuyt555 » 23.02.2013 22:07:07

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

Да так и есть, так и происходит.
Видимо надо использовать TThread. Другие варианты не совсем подходят.
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51

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

Сообщение alexs » 24.02.2013 00:47:03

Чтобы не блокировалось - надо Application.ProcessMessages !
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение poiuyt555 » 24.02.2013 19:22:21

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

В итоге пока так и сделал, поставил Application.ProcessMessages в цикле в одно из условий (туда цикл заходит но не на каждой итерации).
Кнопка стоп заработала.
poiuyt555
новенький
 
Сообщения: 51
Зарегистрирован: 12.09.2011 07:45:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 248

Рейтинг@Mail.ru