Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2012, 12:57   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию Рекурсивный поиск в потоке(TThread). Как?

Доброго времени суток!

Пишу сервисное приложение.
Запускаемй поток должен вызывать свой execute, где вызывается рекурсивная функция поиска чего-то.

но метод EXECUTE вообще не отрабатывает.

в логе я вижу:
Цитата:
_Init
_Final
Что соответствует конструктору и деструктору класса потока.


Вот так в целом все выглядит:
Код:

constructor TScanThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
  Priority := tpHigher;
  fLog := TLogFile.Create;
  fLog.SavePath := myDir;
  fLog.Add('_Init');
end;

destructor TScanThread.Destroy;
begin
  fLog.Add('_Final');
  fLog.Free;
  inherited;
end;

procedure TScanThread.Execute;
begin
  fLog.Add(fStartScan);  //передаю в поток диск x:\ 
  ListFileAndHash(fStartScan);
end;

procedure TScanThread.ListFileAndHash(StartDir: string);
var
  SearchRec: TSearchRec;
  Buff: string;
  fName: string;
  i, i2: SmallInt;
begin
  try
    fLog.Add('FindFirst at "'+StartDir + '*.*"');
    if FindFirst(StartDir + '*.*', faAnyFile, SearchRec) = 0 then
    begin
      repeat
        fLog.Add('Looking fo "'+StartDir+'"');
        if Terminated then
          Exit;
        if (SearchRec.Attr and faDirectory) <> faDirectory then
        begin
          if Terminated then
            Exit;
          if StartDir + SearchRec.Name <> StartDir then
          begin
            fLog.Add('fName = ' + SearchRec.Name);
            fName := SearchRec.Name;
            // Цикл по файлам
            for i := cFilesAMin to cFilesAMax do
            begin
              if Terminated then
                Exit;
              // если это наш файл
              fLog.Add('fName <> [' + IntToStr(i) + ']' + aSearchFilesList[i]);
              if (LowerCase(fName) = LowerCase(aSearchFilesList[i])) then
              begin
                fLog.Add('fName = [' + IntToStr(i) + ']' + aSearchFilesList[i]);
                // цикл// по каталогам
                for i2 := cFoldersAMin to cFoldersAMax do
                begin
                  if Terminated then
                    Exit;
                  // если рядом с файлом есть нужный каталог
                  fLog.Add('fName = [' + IntToStr(i) + ']' + aSearchFilesList[i]
                    + ' <> [' + IntToStr(i2) + ']' + aSearchFoldersList[i2]);
                  if DirectoryExists(StartDir + aSearchFoldersList[i2]) then
                  begin
                    fLog.Add('fName = [' + IntToStr(i) + ']' + aSearchFilesList
                      [i] + ' = [' + IntToStr(i2) + ']' +
                      aSearchFoldersList[i2]);
                    // передаем папку..
                    if Assigned(fOnFound) then
                      fOnFound(StartDir);
                  end;
                end;
              end;
            end;
          end;
          if Terminated then
            Exit;
        end
        else
        begin
          if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
          begin
            fLog.Add('resursive moved to "'+StartDir + SearchRec.Name + '\'+'"');
            // Recursive
            ListFileAndHash(StartDir + SearchRec.Name + '\');
          end;
        end;
        if Terminated then
          Exit;
      until FindNext(SearchRec) <> 0;
    end;
  finally
    fLog.Add('ResursiveSearchThread>_FinallySection');
    FindClose(SearchRec);
  end;
end;
Суть потока:
Пробежаться по разделу HDD при помощи рекурсиии, и найти несколько папок по указанным условиям.

Проблема:
Метод execute у TScanThread вообще не выполняется.
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 13:14   #2
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

"Execute; override;" не забыли?
Silver_S вне форума Ответить с цитированием
Старый 09.03.2012, 15:28   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Да, это исправило проблему.
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 19:44   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Компиль по этому случаю должен выдать ворнинг
[Warning] ....pas(...): Method '...' hides virtual method of base type '...'
Не игнорируем !

Может данные (или даже все) ворнинги отключены директивой или в настройках ?
phomm вне форума Ответить с цитированием
Старый 09.03.2012, 20:44   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Там сотни ворнингов =)

Но среди них, этого не было.
Человек_Борща вне форума Ответить с цитированием
Старый 09.03.2012, 20:52   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам бы с -Wall скомпилить проект.

я вообще считаю что даже варнинг это плохо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2012, 21:19   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Но среди них, этого не было
Значит в настройках отключен этот Warning
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.03.2012, 21:24   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Не трогаю настройки отладчика вообще =)
Может я его и не заметил. Но проблему это исправило.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсивный поиск с возвратом mego4el Помощь студентам 0 25.04.2011 22:45
Рекурсивный поиск файлов в системе. grigorill2 C# (си шарп) 1 26.02.2011 15:26
Реализовать слежение за процессом в потоке Tthread Человек_Борща Общие вопросы Delphi 4 09.11.2010 21:23
Рекурсивный поиск zumm Общие вопросы Delphi 7 01.11.2010 22:47
Как оповестить основной поток о каком-то событии в потоке (TThread)? TwiX Общие вопросы Delphi 2 11.02.2010 02:57