Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1126109229
Dust
2005-09-07 20:07
2005.10.23
ADOQuery не видит параметров при загрузке запроса


2-1128240549
ABS
2005-10-02 12:09
2005.10.23
Опять параметры


14-1128056956
Ega23
2005-09-30 09:09
2005.10.23
С днем рождения! 30 сентября


14-1128364792
Darkwing
2005-10-03 22:39
2005.10.23
Книга про базы данных в Delphi


14-1128316032
Тульский
2005-10-03 09:07
2005.10.23
Файервол для среднего пользователя





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский