Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прервать большой цикл? [D6, Win2k]


Tzota ©   (2002-06-24 18:53:00) 

У меня в программе считается большой цикл. Иногда, конечно, хочется его прервать (хотя бы просто закрыв программу), но программа так увлекается этим самым циклом, что ни на какие внешние нажатия мышки не реагирует. Тогда я, как написано в книжке, внутри цикла вставил Application.ProcassMessages(). И - о, чудо! - все кнопки стали нажиматься, в том числе и кнопка закрытия формы!!! НО, эффект от их нажатия происходит только тогда, когда цикл досчтитается до конца. А можно все-таки сделать, чтобы эффект от нажатия на кнопки происходил немедленно?


jedi   (2002-06-25 20:42:00) [1]

obyavlyashi global"nuiu peremenuiu naprimer: Stop tipa Boolean. V OnClick na necotoroi cnopche stavishi Stop := True;
v tsicle provoreashi esli Stop = true then break:
var
Stop := True;

procedure TForm1.Button1Click(Sender: TObject);
begin
Stop := True;
end;

procedure MyProcedure;
begin
Stop := False;
for i:=1 to 1e7
begin
if Stop then Break;
x:=x+1;
Application.ProcessMessages();
end;
end;


Hotea lu4she cone4no zasinuti atot tsicl v otel"nii potok...


jedi   (2002-06-25 20:40:00) [2]

obyavlyashi global"nuiu peremenuiu naprimer: Stop tipa Boolean. V OnClick na necotoroi cnopche stavishi Stop := True;
v tsicle provoreashi esli Stop = true then break:
var
Stop := True;

procedure TForm1.Button1Click(Sender: TObject);
begin
Stop := True;
end;

procedure MyProcedure;
begin
for i:=1 to 1e7
begin
if Stop then Break;
x:=x+1;
Application.ProcessMessages();
end;
end;


Aladin   (2002-06-25 20:30:00) [3]

Не нада. Malder этот код уже набил


Tzota   (2002-06-25 19:03:00) [4]

Щаз я попробую набить все даденные мне советы... а там посмотрим...


Aladin   (2002-06-25 18:52:00) [5]

Тю. У меня такая же проблема была... и вот этой веткой навеяло... Придумал. Могу код дать


Tzota   (2002-06-25 17:18:00) [6]

Блин, ребята, по ходу я криво излагаю ситуацию.
Код можно свести вот к этому:


for i:=1 to 1e7
begin
x=x+1;
Application.ProcessMessages();
end;

Так про что речь и идёт! ProcessMessages стоит ВНУТРИ цикла, очередь до него ДОХОДИТ, но реакции НИ ФИГА. Единственное, что изменилось с добавлением ProcessMessages - это видно, что кнопка закрытия формы нажимается, но всё равно не срабатывает! То есть где-то посередине цикла жмёшь крестик в углу формы, а реакции - шиш.

З.Ы. Кстати, тому господину, что посоветовал мне использовать break... Спасибо большое, млин, я знаю как выйти из цикла, слава богу стаж уж больше 10 лет. Вы просто не поняли ситуации.


Aleks1   (2002-06-25 03:08:00) [7]

Имхо, скорее всего и сам цикл, и вставка в него ProcessMessages написаны так, что ??? Во всех остальных случаях - все работает нормально!
Короче, код в студию!


shodan   (2002-06-25 00:50:00) [8]

Я новичок в Делфи, сори если ошибаюсь.
Но я попробовал бы обработаь процедуру onClick написанную для кнопки СТОПв теле цикла, проверить Sender и решить, что делать Break/not Break.


Юрий Зотов   (2002-06-24 23:37:00) [9]

Кнопка посылает сообщение в очередь. Чтобы сработал ее OnCLick, это сообщение надо из очереди выбрать и обработать. Этим как раз и занимается Application.ProcessMessages. И пока Ваш цикл на своем очередном витке до него не дойдет, естественно, ничего не происходит.

Хотите немедленной (с точки зрения человека) реакции - загоняйте цикл во вспомогательный поток, а по кнопке вызывайте TerminateThread.


Anatoly Podgoretsky   (2002-06-24 19:34:00) [10]

Цикл прерывается командой BREAK!


Tzota   (2002-06-24 19:06:00) [11]

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


Tzota   (2002-06-24 19:04:00) [12]

Хех, понимаешь ли... про то и речь. Кнопочка "Выход" (допустим, Button1) у меня нажимается (ЧИСТО ВИЗУАЛЬНО НАЖИМАЕТСЯ), но процедура Button1.Click не запускается, пока цикл не кончится. То есть нажатие мышки как бы складывается в буффер до окончания цикла...


Song   (2002-06-24 18:58:00) [13]

В цикл нужно вставить анализирование флага, а на нажимание кнопки (кнопок) его установку.


Наверх

Титульная страница Поиск, карта сайта Написать письмо