Другие языки программирования и технологии

Организовать кнопку прервать в Delphi

Работаю в Delphi7. Вот допустим есть одна форма. На ней две кнопки. Одна кнопка ОК, вторая Прервать. На нажатие кнопки ОК работате процедура, время выполнения которой 3-5 минут. Ну допустим for i:=1 to 1000 do begin много всяких операций end; Как сделать так, чтоб программа не подвисала во время выполнения этой процедуры? Чтоб её окно двигать можно было. И как организовать прервыание расчетов по нажатию кнопки Прервать? Заранее спасибо :)
GP
G. Petro
88
Заведите глобальную переменную, например NeedStop: Boolean;

var
Form1: TForm1;
NeedStop: Boolean;
implementation

{$R *.dfm}

procedure TForm1.bOKClick(Sender: TObject);//кнопка с действиями
var
I: Integer;
begin
NeedStop := False;
for I := 0 to 10000 do
begin
Label1.Caption := IntToStr(I);
{...
другие операции
...}
Application.ProcessMessages();
if (NeedStop) then
Break;
end;
end;

procedure TForm1.bStopClick(Sender: TObject);//кнопка для прерывания
begin
NeedStop := True;
end;
Игорь Кукинов
Игорь Кукинов
4 072
Лучший ответ
Если свою длительную процедуру вставляешь в обработчик события кнопки, то ничего не спасет. Форма будет висеть до тех пор, пока не завершиться обработчик события кнопки. И реагировать программа ни на что не будет, в том числе и на нажатия других кнопок. Длительные процедуры нужно запускать в отдельном потоке. Обработчик события кнопки запускает новый поток, и на этом завершается, программа может работать далее, реагируя на все остальные события.
Чтобы прервать эту процедуру необходима синхронизация потоков. Сам поток в ходе выполнения длительных действий должен проверять событие остановки. А кнопка прервать - устанавливать это событие.
Всякие глобальные переменные не помогут при отсутствии многопоточности и отсутствии синхронизации потоков.
Таймеры - это вообще полный бред, совершенно из другой оперы.

PS для справки: событие - это объект ядра. Учи про потоки, про события (CreateThread, CreateEvent, и так далее)
Мадияр Юлдашев
Мадияр Юлдашев
21 360
Если ты заведёшь цикл в основном потоке (те на самой форме ) то в события, на нажатия кнопки прервать, реакции от системы не поступит . Поэтому читай как работать с различными потоками, или заюзай таймер, или осуществляй цикл на другой форме
Википедия -> оптимизация