Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Закрытие окна во время цикла   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
3-1126109229
Dust
2005-09-07 20:07
2005.10.23
ADOQuery не видит параметров при загрузке запроса


1-1128105720
Volf_555
2005-09-30 22:42
2005.10.23
Проблема с временем


14-1128404400
Rentgen
2005-10-04 09:40
2005.10.23
Torry опять упал?


1-1128062786
webpauk
2005-09-30 10:46
2005.10.23
Список папок


14-1127987477
Карелин Артем
2005-09-29 13:51
2005.10.23
Киньте в меня алгоритмами выбора оптимального пути из А в Б.