Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];

Вниз

Как прервать большой цикл?   Найти похожие ветки 

 
Tzota   (2002-06-24 18:53) [0]

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


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

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


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

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


 
Tzota   (2002-06-24 19:06) [3]

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


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

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


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

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

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


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

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


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

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


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

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


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

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

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


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

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


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

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


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

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


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

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;


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

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...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
14-23758
ATLANTIDO
2002-06-03 18:49
2002.07.08
it a test


1-23622
Toniel
2002-06-24 16:38
2002.07.08
Большой текстовый файл


14-23781
Новеньки в Делфи
2002-06-08 22:31
2002.07.08
Перспектвы Delphi


8-23678
ATLANTIDO
2002-03-01 19:07
2002.07.08
ИМПОРТ 3D-МОДЕЛЕЙ


8-23687
Лёша
2002-02-22 17:02
2002.07.08
Цифровой фильтр.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский