Delphi 在线程中搜索文件
得到了这个非常简单的函数来搜索文件:
function FindFiles(const Path, Mask: string; IncludeSubDir: boolean): integer;
var
FindResult: integer;
SearchRec: TSearchRec;
begin
Result := 0;
FindResult := FindFirst(Path + Mask, faAnyFile - faDirectory, SearchRec);
while FindResult = 0 do
begin
//!!!!!!!! This must synchronize Form1.Memo2.Lines.Add(Path + SearchRec.Name);
Result := Result + 1;
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
if not IncludeSubDir then
Exit;
FindResult := FindFirst(Path + '*.*', faDirectory, SearchRec);
while FindResult = 0 do
begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
Result := Result + FindFiles(Path + SearchRec.Name + '\', Mask, True);
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
它被调用为:
FindFiles('C:\','*.*',TRUE)
How to break this into Delphi thread? 这段代码适合我的需要(d2010)我只需要把它(或它的一部分)放入一个线程中。 谢谢
Got this pretty straight forward function to search for files:
function FindFiles(const Path, Mask: string; IncludeSubDir: boolean): integer;
var
FindResult: integer;
SearchRec: TSearchRec;
begin
Result := 0;
FindResult := FindFirst(Path + Mask, faAnyFile - faDirectory, SearchRec);
while FindResult = 0 do
begin
//!!!!!!!! This must synchronize Form1.Memo2.Lines.Add(Path + SearchRec.Name);
Result := Result + 1;
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
if not IncludeSubDir then
Exit;
FindResult := FindFirst(Path + '*.*', faDirectory, SearchRec);
while FindResult = 0 do
begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
Result := Result + FindFiles(Path + SearchRec.Name + '\', Mask, True);
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
It is called with :
FindFiles('C:\','*.*',TRUE)
How to break this into Delphi thread?
This code suits my needs (d2010) I just need to put it (or parts of it) into a thread.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
也许是这样的?
如果您希望将项目逐一添加到 VCL 控件中,您将失去线程的一些好处,但当然,这是可以做到的:
Maybe something like this?
If you want the items to be added to the VCL control one-by-one you lose some of the benefits of threading, but sure, it can be done:
可以找到使用消息而不是 Synchronize 的基于 OmniThreadLibrary 的解决方案 此处。
An OmniThreadLibrary-based solution which uses messages instead of Synchronize can be found here.
看看我的答案 Indy 10 IdTCPClient 使用读取数据一个单独的线程? 以及其中包含的链接,用于使用匿名方法在线程内运行给定函数的更优雅的方式。这个想法是实现一个在线程内执行任何
TProc
的类。然后,匿名方法功能可让您轻松就地定义此TProc
,并可以访问调用上下文的所有局部变量。Look at my answer Indy 10 IdTCPClient Reading Data using a separate thread? and the link contained in it for a more elegant way of running a given function inside a thread using anonymous methods. The idea is to implement once a class that executes any
TProc
inside a thread. The anonymous method feature then lets you easily define thisTProc
in-place and with access to all local variables of the calling context.