用了一个现成的第三方的类,发现是多线程的。引用的时候很简单:
  fe := TJclFileEnumerator.Create;
  fe.RootDirectorie := 'c:\';
  fe.FileMask := '*.txt';
  fe.FillList(files);  //var files: TStrings;
  ……   //其他代码
  fe.free; //释放在执行FillList函数应该是另起了一个线程,因为后面的free接着也执行了。但我想让filllist执行完后,再执行后面的代码。如何才能做到这一步?
谢谢大家指教。

解决方案 »

  1.   

    while true do begin
      if files处理完成 then
        break;
    end;
      

  2.   

    尝试用
    while true do begin
      if fe.runningtask<>1 then  //线程执行完后runningtask属性会置0
        break;
    end;
    但是陷入死循环。WaitForSingleObject怎么得到句柄呀?
      

  3.   

    直接fe.WaitFor这样等待会阻塞主线程
      

  4.   

    fe.WaitFor?
    没提供这个方法呀。
      

  5.   

    WaitForSingleObject他等待的就是线程句柄
      

  6.   

    另外获取线程句柄的方法有很多
    //用窗体句柄获得线程id
    dwThreadID := GetWindowThreadProcessId(hWindow, nil);
    再用OpenThread获得线程句柄
    这个函数delphi没有提供……必须自己定义
    function OpenThread(dwDesiredAccess: DWORD; bInheritHandle:   
      BOOL; dwProcessId: DWORD): THandle; external   
      kernel32 name 'OpenThread'; 
    不过上述方法必须用dll注入的方式获取
    如果纯等待的话可以自己创建第三方程序进程,然后等待进程句柄也是一样的