Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2009, 00:38   #1
TilerDerton
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 34
По умолчанию Выход из бесконечного цикла

Не могу понять.
Вот, например, использую я бесконечный цикл, активируемый 1-й кнопкой. Что написать во 2-й кнопке, чтобы она рубила программу? (стандартный крестик в углу не закрывает, хотя программа точно работает, не зависла)
TilerDerton вне форума Ответить с цитированием
Старый 04.03.2009, 00:41   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Попробуйте так:
Код:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
Application.Terminate;
End;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 04.03.2009, 00:52   #3
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

вот так:
Код:
// вечный цикл
flag:=false;
while true do begin
  application.processmessages;
  if flag then break;
  //do something
end;
flag:=false;
application.processmessages;

//кнопка 2
flag:=true;
while flag do
  application.processmessages;
//а теперь уже 
Application.Terminate;

Последний раз редактировалось Роман Радер; 04.03.2009 в 00:55.
Роман Радер вне форума Ответить с цитированием
Старый 04.03.2009, 04:58   #4
5naip
Форумчанин
 
Аватар для 5naip
 
Регистрация: 05.10.2007
Сообщений: 536
По умолчанию

эммм...кажется,если у вас получается бесконечный цикл,то форма графически подвисает,и вы уже вряд ли что-то нажмете..а если и нажмете, то зависнет окончательно. Тут лучше потоки использовать...
rocklistener...
5naip вне форума Ответить с цитированием
Старый 04.03.2009, 06:32   #5
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Код:
halt;
- вырубит.
Lime вне форума Ответить с цитированием
Старый 04.03.2009, 09:11   #6
TilerDerton
Пользователь
 
Регистрация: 12.02.2009
Сообщений: 34
По умолчанию

5naip, Форма не подвисает, в цикле используется процедура c мелкими слипами, т.е. кнопки нажимаются без вреда для самой работы (форма прекрасно "таскается" по экрану). Проблема в том, что цикл не реагирует на стороннее вмешательство.
Роман Радер, а вот Ваш ответ меня заинтересовал, буду дома, попробую...
Terran, пробовал, не реагирует.
Всем спасибо...
TilerDerton вне форума Ответить с цитированием
Старый 04.03.2009, 09:45   #7
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

Как уже было сказано добавь флаг и поставь его в тело цыкла, а значение меняй на 2 кнопке ... если слипами то работает .
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 05.03.2009, 09:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
TilerDerton
Либо этот цикл в отдельный поток либо в цикле прописать Application.ProcessMessage. Но лучше в поток.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.09.2010, 11:12   #9
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

В чем вопрос? Application.ProcessMessage позволяет влезть в любой цикл и дать команду на прерывание цикла или же полностью закрыть приложение (Halt).
Простой пример - на форме кнопки Пуск и Стоп цикла. В цикле мигает квадратик.
Код:
procedure TForm1.BPuskClick(Sender: TObject);
begin
  flag:= true;
  BStop.SetFocus;
  while flag = true do
  begin
    Inc(cnt);
    if (cnt mod 10000) = 0 then begin _color:= not _color; cnt:= 1; end;
    if _color = true then Form1.Canvas.Brush.Color:= clRed
    else Form1.Canvas.Brush.Color:= clBtnFace;
    Form1.Canvas.Rectangle(100,100,150,150);
    Application.ProcessMessages;
  end;
end;

procedure TForm1.BStopClick(Sender: TObject); // Стоп по кнопке на форме
begin
  flag:= false;
  Form1.Canvas.Brush.Color:= clBtnFace;
  Form1.Canvas.Rectangle(100,100,150,150);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; // Стоп по клавише клавиатуры (любая)
  Shift: TShiftState);
begin
   BStopClick(Sender);
end;
Прерывание цикла или по кнопке формы или по любой клавише клавиатуры.
Полоностью проект во вложении.

Чет я ступил, не посмотрел на дату. Перешел по ссылке из другой темы http://www.programmersforum.ru/showthread.php?t=112021. Там ответ более был бы актуален.
Вложения
Тип файла: rar Прерывания цикла.rar (5.4 Кб, 32 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 03.09.2010 в 11:29.
DeKot вне форума Ответить с цитированием
Старый 10.09.2010, 08:48   #10
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Application.ProcessMessage - дает возможность системе обработать процесс. Для бесконечных циклов это если и работает - использовать нельзя. Так как будет не стабильно. Пиши отдельный поток, в нем цикл. В основном потоке - обработка нажатий кнопок.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из цикла RIO Помощь студентам 1 21.04.2008 22:55
Как выйти из бесконечного цикла! Эдуард Общие вопросы C/C++ 11 02.03.2008 19:15
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10
Паскаль. Сумма бесконечного ряда Tream Помощь студентам 4 13.10.2007 23:42