Я такое писал, создавал поток который сканит выбранную папку на наличие файлов по заранее известной маске, в зависимости от файла выполняет действия.
модуль потока
Код:
unit ScanDir;
interface
uses
Classes, Windows, SysUtils;
type
FParam = record
ID: integer;
Str: string; // путь к директории с файлами
Name: string; // имя потока
FName: string; // маска файла
end;
TScanDir = class(TThread)
public
constructor Create(Param: FParam);
private
protected
P: FParam;
procedure Execute; override;
end;
implementation
uses
main; // модуль с формой
procedure TScanDir.Execute;
var
r: Cardinal;
fn: THandle;
SRec: TSearchRec;
begin
fn := FindFirstChangeNotification(pChar(P.str), True,
FILE_NOTIFY_CHANGE_FILE_NAME);
repeat
r := WaitForSingleObject(fn, 1000);
if r = WAIT_OBJECT_0 then
begin
if FindFirst(P.Str + '\' + P.AName, faAnyFile, SRec) = 0 then
repeat
GlobalThreadID := p.ID; // глобальные переменные
GlobalThreadName := p.Name; // чтобы в статистике знать
GlobalThreadDir := p.Str; // какой поток сработал
GlobalThreadFile := SRec.Name;
Synchronize(Form1.UpdateMemo);
Synchronize(form1.ExtractFile);
until FindNext(SRec) <> 0;
FindClose(SRec);
end;
if not FindNextChangeNotification(fn) then
break;
until Terminated;
FindCloseChangeNotification(fn);
end;
constructor TScanDir.Create(Param: FParam);
begin
inherited Create(true);
P := Param;
end;
end.
ну и соответственно запускаешь потоки из основной программы
Код:
...
var
ThreadScanDir: TScanDir;
....
ThreadScanDir := TScanDir.Create(Param);
ThreadScanDir.FreeOnTerminate := true;
ThreadScanDir.Priority := tplower;
ThreadScanDir.Resume;