| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |