Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Поиск в потоке   Найти похожие ветки 

 
13   (2006-04-22 18:16) [0]

Написал программу для поиска файлов на диске, однако при поиске  
 программа загружает процессор на 100% и становится подвисшей. У меня вопрос как можно реализовать поиск в отдельном потоке.


 
antonn ©   (2006-04-22 18:33) [1]

примерно также, как и основном потоке...


 
13   (2006-04-22 18:40) [2]

а можно пример или поподробней


 
Мефисто   (2006-04-22 18:48) [3]

\Delphi\Demos\Threads


 
antonn ©   (2006-04-22 18:52) [4]

unit FildSkin;

interface

uses
 Windows, Messages, Classes, SysUtils;

type
 TFindSkinThread = class(TThread)
 private
   _FindList:Tstrings;
   Path:string;
   Old:boolean;
   function adddir(Path: string; Recursive: Bool; dd:Tstrings): integer;
 protected
   procedure Execute; override;
   destructor Destroy; override;
   procedure BackList;
 public
   constructor Create(CreateSuspennded: Boolean; const _Path: string);
 end;

implementation

uses Skin_file;

constructor TFindSkinThread.Create(CreateSuspennded: Boolean; const _Path:string);
begin
 inherited Create(true);
 Path:=_Path;
 resume;
end;

function NormalDir(const DirName: string): string;
begin
 Result := DirName;
 if (Result <> "") and
{$IFDEF RX_D3}
 not (AnsiLastChar(Result)^ in [":", "\"]) then
{$ELSE}
 not (Result[Length(Result)] in [":", "\"]) then
{$ENDIF}
 begin
   if (Length(Result) = 1) and (UpCase(Result[1]) in ["A".."Z"]) then
     Result := Result + ":\"
   else Result := Result + "\";
 end;
end;

function TFindSkinThread.adddir(Path: string; Recursive: Bool; dd:Tstrings): integer;
var Dirs: TSearchRec; Res,Ver: integer;
begin
   Result := -1;
    Res := FindFirst(NormalDir(Path) + "*.*", faReadOnly + faHidden + faArchive + faDirectory, Dirs);
        while Res = 0 do
        begin
   if ((Dirs.Attr and faDirectory) <> 0) and (Recursive)
     then begin
     if not ((Dirs.Name = ".") or (Dirs.Name = ".."))
        then begin
       if Result < 0
         then Result := adddir(NormalDir(Path) + Dirs.Name, True,dd)
       else
         adddir(NormalDir(Path) + Dirs.Name, True,dd);
     end
   end
   else begin
       if lowercase(extractfileext(Dirs.Name))=".sdc" then  begin
        dd.Add( NormalDir(Path)+Dirs.Name);
       end;
   end;
   Res := FindNext(Dirs);
 end;
 FindClose(Dirs);
end;

procedure TFindSkinThread.Execute;
begin
 FreeOnTerminate:=True;
 _FindList:=TstringList.Create;
 try
 adddir(path,true,_FindList);
 Synchronize(BackList);
 finally
 _FindList.Free;
 end;
end;

destructor TFindSkinThread.Destroy;
begin
Terminate;
inherited;
end;

procedure TFindSkinThread.BackList;
begin
 Skin_file.Build_skin_stringsThread(_FindList);
//короче тут передача "потокового" списка с найденым в основной поток (к Tform1, например)
end;

end.


использование в программе:
var FindSkinThread:TFindSkinThread;
begin
FindSkinThread:=TFindSkinThread.Create(false,path1);
end;


ЗЫ где то мог чего переудалить, т.ч. это только для примера:)


 
begin...end ©   (2006-04-22 20:04) [5]

> antonn ©   (22.04.06 18:52) [4]

Деструктор можно убрать.



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
1-1145271748
Viper_Omsk
2006-04-17 15:02
2006.05.28
Как передать данные из Excel в StringGrid?


2-1147474989
Призрак
2006-05-13 03:03
2006.05.28
Synchronize


2-1147433954
Ламот
2006-05-12 15:39
2006.05.28
Запуск/закрытие стороннего приложения


2-1147327880
rosl
2006-05-11 10:11
2006.05.28
время


1-1145344069
Darvin
2006-04-18 11:07
2006.05.28
Получение картинки из ImageList для кнопки SpeedButton