用了一个现成的第三方的类,发现是多线程的。引用的时候很简单:
fe := TJclFileEnumerator.Create;
fe.RootDirectorie := 'c:\';
fe.FileMask := '*.txt';
fe.FillList(files); //var files: TStrings;
…… //其他代码
fe.free; //释放在执行FillList函数应该是另起了一个线程,因为后面的free接着也执行了。但我想让filllist执行完后,再执行后面的代码。如何才能做到这一步?
谢谢大家指教。
fe := TJclFileEnumerator.Create;
fe.RootDirectorie := 'c:\';
fe.FileMask := '*.txt';
fe.FillList(files); //var files: TStrings;
…… //其他代码
fe.free; //释放在执行FillList函数应该是另起了一个线程,因为后面的free接着也执行了。但我想让filllist执行完后,再执行后面的代码。如何才能做到这一步?
谢谢大家指教。
if files处理完成 then
break;
end;
while true do begin
if fe.runningtask<>1 then //线程执行完后runningtask属性会置0
break;
end;
但是陷入死循环。WaitForSingleObject怎么得到句柄呀?
没提供这个方法呀。
//用窗体句柄获得线程id
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
再用OpenThread获得线程句柄
这个函数delphi没有提供……必须自己定义
function OpenThread(dwDesiredAccess: DWORD; bInheritHandle:
BOOL; dwProcessId: DWORD): THandle; external
kernel32 name 'OpenThread';
不过上述方法必须用dll注入的方式获取
如果纯等待的话可以自己创建第三方程序进程,然后等待进程句柄也是一样的