Главная страница
    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.037 c
10-1106136082
Andy BitOff
2005-01-19 15:01
2005.10.23
Закрытие WINWORD.EXE. Как?


9-1118294977
.cpp
2005-06-09 09:29
2005.10.23
Множестово слоёв изображений (всем кто делает карты )


3-1126499470
oleg_p
2005-09-12 08:31
2005.10.23
Не работает ORDER BY


1-1127969777
AngelOKES
2005-09-29 08:56
2005.10.23
Экспорт в Excel тремя способами


2-1127749588
erika
2005-09-26 19:46
2005.10.23
fb





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