![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неожиданное-рядом!! (или как прервать программу?) [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;