Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неожиданное-рядом!! (или как прервать программу?) [D7, XP]


zvm ©   (2007-06-26 12:32:00) 

Вот прога!
по первой кнопке оргомный цикл - программа виснет.
Задача - второй кнопкой прервать этот висяк.

Почему это все не работает?
(ПрогрессБар для контроля работы цикла.)

implementation

{$R *.dfm}
var flag:boolean;

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
l:real;
begin
flag:=false;
for i:=1 to 1000  do
for j:=1 to 1000  do
for k:= 1 to 1000  do
begin
if flag then break;
l:=sin(k);
progressbar1.Position:=k div 10;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
flag:=true;
end;

end.


homm   (2007-06-26 21:44:00) [1]

> или флаг проверять в каждом цикле...

Можно только в верхнего уровня. Появится небольшая латентность, но зато пна производительности почти не скажется


{RASkov}   (2007-06-26 20:10:00) [2]

> ...Ну соответственно, все что после циклов в пролете)...

Т.е. в конкретном случае - не страшно, так как после циклов ничего нет...:)


{RASkov}   (2007-06-26 20:08:00) [3]

> заменить на Exit

...Ну соответственно, все что после циклов в пролете)...


{RASkov}   (2007-06-26 20:07:00) [4]

> for i:=1 to 1000  do
>      for j:=1 to 1000  do
>        for k:= 1 to 1000  do
>          begin
>           if flag then break; !!!!!<--- здесь мы выходим из цикла k, а остальные так и работают...
>           l:=sin(k);
>           progressbar1.Position:=k div 10;
>          end;

Т.е. либо Break заменить на Exit [5] или флаг проверять в каждом цикле...


homm   (2007-06-26 12:58:00) [5]

> что клик на кнопку вызывает прерывание

Вызывает. Система его обрабатывает, и ставит в очередь сообщений приложения сообщение об этом событии, а ты уж сам должен позаботиься, о том, что-бы его обработать, если вдруг процесс уже выполняеться.


Loginov Dmitry   (2007-06-26 12:54:00) [6]

Break -> Exit


zvm   (2007-06-26 12:53:00) [7]

Спасибо!
Сейчас попробую!
По простоте душевной думалось,
что клик на кнопку вызывает прерывание
и винда ВСЕГДА передает это прерывание в программу.

Век живи-век учись!
Спасибо.


Сергей М.   (2007-06-26 12:48:00) [8]


> как прервать программу?

Не программу, а подпрограмму.
Разницу-то осюсяешь или тебе по барабану ?)


StriderMan   (2007-06-26 12:48:00) [9]

вставь в цикл

Application.ProcessMessages;


ЮЮ   (2007-06-26 12:46:00) [10]

Тногда надо давать возможность на ту кнопку нажать.

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
l:real;
begin
flag:=false;
for i:=1 to 1000  do
for j:=1 to 1000  do begin
 for k:= 1 to 1000  do begin
   if flag then break;
   l:=sin(k);
   progressbar1.Position:=k div 10;
 end;
  Application.ProcessMasseges;
 end;

end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо