Главная страница
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.04 c
1-1128075394
pahan07
2005-09-30 14:16
2005.10.23
что я не так делаю?


1-1128086706
fet
2005-09-30 17:25
2005.10.23
Оконтуривание в Delphi


6-1120014063
vidiv
2005-06-29 07:01
2005.10.23
sniffer


14-1127834589
pazitron_brain
2005-09-27 19:23
2005.10.23
Поделитесь опытом.


2-1127825697
Anton22
2005-09-27 16:54
2005.10.23
Строка в буфер