![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
выход из процедуры
ed_209 © (2002-09-14 05:18:00)есть такой код, работает при нажатии на кнопку Старт:
for i:=0 to lbengines.Items.Count -1 do
begin
dosearch(lbengines.Items[i]);
frmstatus.lbOps.Items.Add(lbengines.Items[i]+": search finished");
end;
frmstatus.lbOps.Items.Add("Done!");
...
в процедуре dosearch() идет работа с файлами (довольно долго).. Как при нажатии на кнопку Стоп в любой момент времени выйти из этой процедуры?
ed_209 (2002-09-16 09:25:00) [1]ладно... спасибо, попробую что-нибудь
Yaro (2002-09-15 20:41:00) [2]Gun Expert -> мг... молчу
Gun Expert (2002-09-15 18:16:00) [3]По-моему, можно и таймер использовать для проверки
Сергей Медяник (2002-09-15 09:41:00) [4]Я использую:
> Mystic © (14.09.02 07:55)
> Самое простое
> 1) в теле цикла вставлять Application.ProcessMessages
> 2) а также создать Bool переменную и ее проверять, как уже
> говорили.
НО: указанную проверку можно выполнять не на каждую интерацию, чтобы не притормаживала обработка, а ставить в конструкцию
if (i mod ПЕРИОДИЧНОСТЬ)=0 then- это актуально для циклов с большим числом интераций и недолгой обработкой каждой интерации.
begin
Application.ProcessMessages;
if CancelPressedFlag then Break;
end;
ed_209, тебе не прийдется вставлять проверку в каждой строке, ставь перед самыми долгими вызываемыми процедурами, а можно вообще один раз, главное после Application.ProcessMessages.
Mystic (2002-09-15 09:26:00) [5]1) Почему чуть ли не в каждую строку? Есть же действия, которые постоянно выполняются (открытие файла, например)?
2) Если отдельным потоком, то все равно прийдется проверять Terminated. TerminateThread лучше не пользоваться. Но почему сразу выполняется Done? Может ты ошибся где?
ed_209 (2002-09-15 07:43:00) [6]1) если делать Bool, то проверку придется вставлять чуть ли не в каждую строку
2) если отдельным потоком - напр. dosearch_thread.execute то сразу же выполняются строки с search finished и Done!
может еще как можно?
Mystic (2002-09-14 07:55:00) [7]Самое простое
1) в теле цикла вставлять Application.ProcessMessages
2) а также создать Bool переменную и ее проверять, как уже говорили.
Хотя грамотнее (при более менее нетривиальныз задачах) оформить отдельным потоком
Poirot (2002-09-14 07:46:00) [8]Ну у меня пока единственный вариант!!! Создать бул перел и проверять её значение если при клике на другую кнопку оно станет напр Тру, то делаем Break