如果我这样执行,我的应用程序将不会响应,直到找到所有文件并将它们添加到列表框中。我的问题是如何使此函数多线程化以避免无响应的情况!我仍然是Delphi新手。
procedure TfrMain.FileSearch(const PathName, FileName : string; txtToSearch : string; const InDir : boolean);
var Rec : TSearchRec;
Path : string;
txt : string;
fh : TextFile;
i : integer;
begin
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
AssignFile(fh, Path + Rec.Name);
Reset(fh);
Readln(fh,txt);
if ContainsStr(txt, txtToSearch) then
ListBox1.Items.Add(Path + Rec.Name);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
If not InDir then Exit;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then
FileSearch(Path + Rec.Name, FileName, txtToSearch, True);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
PostMessage(MainForm.Handle, WM_FILESEARCH_FINISHED, 0, 0)
应该和Synchronize
一起使用吗? - kobikHandle
属性是只读的,其读取是原子性的。而且它必须与0不同(控件将无法工作并且无法接收任何消息),因此getter永远不会在句柄为0时调用CreateHandle
。风险在于对象实例本身,如果销毁了MainForm
并尝试访问它,则通常会出现AV。而且,Embauses
也是这样做的 :-) - TLamaSynchronize
内部使用SendMessage
,它是PostMessage
的阻塞等效版本。 - jpfollenius