![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
выход из цикла [D6, Win2k]
KonstVD © (2003-02-11 17:00:00)В программе есть цикл, есть кнопка, которая должна прерывать этот цикл. Подскажите, плз, как сделать, чтобы прога на эту кнопку правильно и без проблем реагировала?
i-C3H7OH (2003-02-12 10:37:00) [1]со threadом работать оччень просто
TMyThread = class(TThread)
procedure Execute;
end;
procedure TMyThread.Execute;
var i:integer;
begin
for i:=0 to 199999 do
begin
// здесь делай чё надо
...
If Terminated Then Break;
end;
end;
MyThread := MyThread.Create(true);
MyThread.FreeOnTerminate := True;
MyThread.Suspended := false;
OnClick:
MyThread.Terminate;
xn0bys (2003-02-12 08:53:00) [2]
...
for i:=0 to 199999 do
begin
// здесь делай чё надо
...
Application.ProcessMessages;
If Button1.Down Then Break;
end;
...
Писал на память, может поможет...
Андрей Сенченко (2003-02-11 21:30:00) [3]KonstVD (11.02.03 17:00)
Убедительная просьба кстати ... если я вдруг не угадал суть Вашего вопроса - сформулируйте его пожалуйста КОРРЕКТНО
Андрей Сенченко (2003-02-11 21:26:00) [4]Борис_ © (11.02.03 18:21)
Собственно ... это СОВСЕМ не решение. Ну и что, что Вы отключили таймер ?
1. Дальше нужно писать еще кусок кода проверки состояния этого таймера.
2. Собственно сам таймер отнимет системные ресурсы.
3. А у Вас есть уверенность, что сообщение приложению о нажатой кнопке вообще буднт обработано приложением раньше конца цикла ?
Igit © (11.02.03 17:15)
А можно набрать Дятьковского хрусталя совминовской серии и забивать им гвозди, Вы уж извините.
KonstVD (11.02.03 17:00)
Ваш вопрос видимо заключается в том, что при обработке большого количества данных в цикле программа реагирует на нажатие кнопки "не сразу" - создается "эффект подвисания". В этом случае Вам необходимо заставить ее обрабатывать очередь сообщений в каждом шаге цикла. Решение этой проблемы Вам предложил Vit@ly © - нужно поставить в цикле обработчик
Application.ProcessMessages;
,а уже на саму кнопку повесить код, который завершит ваш цикл, например :
1. Установка логического флага, по которому в цикле будет осуществляться жесткий Break
2. Прямое назначение условия конца цикла.
Борис_ (2003-02-11 18:21:00) [5]самое просто но не очень быстродейтсвенное решение - подключить таймер...
а при нажатии на кнопу делать timer1.enabled:=false;
хотя быстрее через поток...но так легче...
Vit@ly (2003-02-11 18:09:00) [6]Application.ProcessMessages;
bak (2003-02-11 17:22:00) [7]еще по таймеру можно организовать
Igit (2003-02-11 17:16:00) [8]Удалено модератором
Примечание: Личная переписка
Igit (2003-02-11 17:15:00) [9]Цикл нужно создать в отдельном потоке