|
Вопрос # 3 668/ вопрос открыт / |
|
Здравствуйте!
Есть процедура поиска файлов.
Она выполняется очень долго, при больших объёмах.
Вопрос как отменить выполнение процедуры (по условию, например по нажатию кнопки Esc), во время её выполнения.
Приложение: Переключить в обычный режим- procedure TForm1.FindFiles(StartFolder, Mask: string; ScanSubFolders: Boolean);
- var
- SearchRec: TSearchRec;
- FindResult: Integer;
- C: Integer;
- S: string;
- begin
- try
- StartFolder := IncludeTrailingBackslash(StartFolder);
- FindResult := FindFirst(StartFolder + '*.*', faAnyFile, SearchRec);
- try
- while FindResult = 0 do
- with SearchRec do
- begin
- if (Attr and faDirectory) <> 0 then
- begin
- if ScanSubFolders and (Name <> '.') and (Name <> '..') then
- FindFiles(StartFolder + Name+'', Mask, ScanSubFolders);
- end
- else
- begin
- if MatchesMask(Name, Mask) then
- CheckListBox1.Items.add (StartFolder + Name);
- end;
- FindResult := FindNext(SearchRec);
- end;
- finally
- FindClose(SearchRec);
- end;
- finally
- CheckListBox1.Items.EndUpdate;
- end;
- C:= CheckListBox1.Items.Count;
-
-
- end;
-
Примечание #1 (19 января 2010, 16:21): Вопрос 2.
Отмена того же процеса, button на форме, дело в том что при выполнении поиска вся форма неактивная.
 |
Вопрос задал: slava863 (статус: Посетитель)
Вопрос отправлен: 19 января 2010, 15:57
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Всё просто, как веник.
Заводишь глобальную переменную, например, UserCancelled: Boolean;
Перед поиском ставишь её := False;
По кнопке "Отмена" ставишь её := True;
В цикле поиска ставишь проверку:
while FindResult = 0 do
with SearchRec do
begin
Application.ProcessMessages();
if UserCancelled
then Exit;
//... тут всё твоё остальное
end;
А чтоб не тормозить выполнение цикла (убрать нафиг Application.ProcessMessages()), можно вынести всё это безобразие в отдельный Thread.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 января 2010, 16:31
Оценка за ответ: 5
Комментарий к оценке: Спасибо
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 19 января 2010, 18:48; участников в обсуждении: 2.
|
slava863 (статус: Посетитель), 19 января 2010, 17:23 [#1]:
а для отдельного процеса,
надо создать доп. процесс и уже в нём вызвать свою процедуру?
|
|
min@y™ (статус: Доктор наук), 19 января 2010, 18:48 [#2]:
Цитата (slava863):
а для отдельного процеса, надо создать доп. процесс и уже в нём вызвать свою процедуру?
Ты процесс с потоком (Thread) не путаешь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|