Другие языки программирования и технологии
Организовать кнопку прервать в Delphi
Работаю в Delphi7. Вот допустим есть одна форма. На ней две кнопки. Одна кнопка ОК, вторая Прервать. На нажатие кнопки ОК работате процедура, время выполнения которой 3-5 минут. Ну допустим for i:=1 to 1000 do begin много всяких операций end; Как сделать так, чтоб программа не подвисала во время выполнения этой процедуры? Чтоб её окно двигать можно было. И как организовать прервыание расчетов по нажатию кнопки Прервать? Заранее спасибо :)
Заведите глобальную переменную, например 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;
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;
Если свою длительную процедуру вставляешь в обработчик события кнопки, то ничего не спасет. Форма будет висеть до тех пор, пока не завершиться обработчик события кнопки. И реагировать программа ни на что не будет, в том числе и на нажатия других кнопок. Длительные процедуры нужно запускать в отдельном потоке. Обработчик события кнопки запускает новый поток, и на этом завершается, программа может работать далее, реагируя на все остальные события.
Чтобы прервать эту процедуру необходима синхронизация потоков. Сам поток в ходе выполнения длительных действий должен проверять событие остановки. А кнопка прервать - устанавливать это событие.
Всякие глобальные переменные не помогут при отсутствии многопоточности и отсутствии синхронизации потоков.
Таймеры - это вообще полный бред, совершенно из другой оперы.
PS для справки: событие - это объект ядра. Учи про потоки, про события (CreateThread, CreateEvent, и так далее)
Чтобы прервать эту процедуру необходима синхронизация потоков. Сам поток в ходе выполнения длительных действий должен проверять событие остановки. А кнопка прервать - устанавливать это событие.
Всякие глобальные переменные не помогут при отсутствии многопоточности и отсутствии синхронизации потоков.
Таймеры - это вообще полный бред, совершенно из другой оперы.
PS для справки: событие - это объект ядра. Учи про потоки, про события (CreateThread, CreateEvent, и так далее)
Если ты заведёшь цикл в основном потоке (те на самой форме ) то в события, на нажатия кнопки прервать, реакции от системы не поступит . Поэтому читай как работать с различными потоками, или заюзай таймер, или осуществляй цикл на другой форме
Википедия -> оптимизация
Похожие вопросы
- как в delphi сделать чтобы при нажатии на определенную кнопку выводился другой символ??
- Delphi 7 оператор отвечающий за изображение кнопки
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- Кто-нибудь знает знает про сокеты в Delphi как организовать сервер/клиент пересылку через интернет что для этого нужно
- Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->
- как сделать чтобы при нажатии на кнопку выводился заданный текст в Delphi. хелп
- Как в Delphi сделать справку?
- Помогите найти ошибку Delphi легкая программка
- Delphi ПОМОГИТЕ ПОЖАЛУЙСТА!
- Java. Swing. Куча кнопок и actionlistener