Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
ВнизЗакрытие окна во время цикла Найти похожие ветки
← →
Eleepod (2005-10-03 12:16) [0]Всем день добрый!
Столкнулся вот с какой проблемкой.
Добавляю Application.ProcessMessages в цикл, чтобы программа не подвисала при расчетах (в цикле считается ряд Фибоначчи). Сделал это для того, чтобы можно было прервать процесс т.к. на итерации > 40 время уже тратиться существенное. Все вроде бы нормально, но вот кнопка закрытия программы (крестик) все равно не работает. Окно закрывается только после завершения всего цикла. Причем, что интересно, кнопка сворачивания окна работает нормально.
Как быть?
← →
stone © (2005-10-03 12:23) [1]Обрабатывать OnClose формы, прерывая цикл
← →
Tonich © (2005-10-03 12:25) [2]
> Eleepod (03.10.05 12:16)
так ты хочешь закрыть приложение только что бы прервать цикл ?????????
← →
Eleepod (2005-10-03 12:52) [3]>так ты хочешь закрыть приложение только что бы прервать цикл ?????????
=))) Это было бы круто!
Приведу отрывок:
procedure TForm1.Button1Click(Sender: TObject);
var
i, : byte;
function Fib(N:integer):Cardinal;
begin
Application.ProcessMessages;
if N < 3
then Fib := 1
else Fib := Fib(N - 1) + Fib(N - 2); // Подсчет N-ого чила Фибоначчи
end;
begin
for i := 1 to StrToInt(Edit1.Text) do
Label4.Caption := Label4.Caption + IntToStr(Fib(i)) + " ";
end;
Во время N-ого подсчета числа окно не закрыветься. Событи OnClose формы выполняется только после завершения цикла.
← →
Tonich © (2005-10-03 13:02) [4]а что break не помогает прерваь цикл, не или exit на кройняк ?
возьми в своем цикле поставь условие типаif N >= нежное число итераций then break;
и программа выйдет из цикла
← →
Tonich © (2005-10-03 13:03) [5]блин что-то у меня сегодня с буквой "е" не лады )))
не или exit на кройняк = ну или exit на кройняк
нежное = нужное
← →
stone © (2005-10-03 13:03) [6]
> Сделал это для того, чтобы можно было прервать процесс
Что-то я не вижу выхода из цикла...
← →
Eleepod (2005-10-03 13:36) [7]Просто если N равно, например, 45, то функция Fib довольно долго находится и если надоест ждать можно все это дело прервать (прервать надо именно рекурсию, но на N не должно быть ограничения). У меня есть кнопка на форме, которая все прерывает, с этим все нормально. Просто вот закрытие окна не работает, пока очередное Fib не найдется. Вот я и решил узнать почему...
← →
Tonich © (2005-10-03 13:41) [8]
> У меня есть кнопка на форме, которая все прерывает, с этим
> все нормально. Просто вот закрытие окна не работает, пока
> очередное Fib не найдется
очень странно, если ты говоришь , что ты прерываешь рекурсию, то вычисления уже не выолняются, и все должно уже нормально и закрываться и открываться. А как же ты ее прерываешь?
← →
begin...end © (2005-10-03 13:45) [9]Вынесите вычисления в отдельный поток. И будет счастье.
← →
Eleepod (2005-10-03 15:11) [10]2 Tonich
Просто Application.ProcessMessages позволяет нажимать кнопки, двигать и сворачивать окно во время вычисления очередного Fib. Вот пояснение в одной из статей: Application.ProcessMessages заставляет выполнить все задачи, которые накопились в данный момент. Странно, но вот закрытие окна не выполняет. Только после окончания вычислений.
2 begin...end
К сожалению, с потоками работать не умею. Но Delphi World 6 Pro нашел много статей на эту тему. Так что занятие на вечер я себе нашел. Будем изучать. :)
← →
Alexander Panov © (2005-10-03 16:53) [11]
var
isBreak: Boolean;
procedure TForm1.Button1Click(Sender: TObject);
begin
isBreak := True;
function Fib(N:integer):Cardinal;
begin
Application.ProcessMessages;
if N < 3
then Fib := 1
else Fib := Fib(N - 1) + Fib(N - 2); // Подсчет N-ого чила Фибоначчи
if isBreak then Exit;
end;
begin
isBreak := False;
for i := 1 to StrToInt(Edit1.Text) do
begin
if isBreak then Break;
Label4.Caption := Label4.Caption + IntToStr(Fib(i)) + " ";
end;
end;
← →
Eleepod (2005-10-03 21:29) [12]У вас там лишний begin :)
Это немного не то, но все равно спасибо за ответ. Я уже разобрался с потоками - все работает как надо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c