function Searchfile(path: string): TStringList;
var
  SearchRec: TSearchRec;
  found: integer;
begin
  Result := TStringList.Create;
  found := FindFirst(path + '\' + '*.txt', faAnyFile, SearchRec);
  while found = 0 do
  begin
    if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and (SearchRec.Attr <> faDirectory) then
      Result.Add(path + '\' + SearchRec.Name);
    found := FindNext(SearchRec);
  end;
  FindClose(SearchRec);
end;API CreateThread(nil, 0, @thtest, nil, 0, ID); 创建线程thtest函数如下
function thtest(): string;
var
  I: Integer;
var
  str: string;
  list: TStringList;
begin
  for I := 0 to 1 do
  begin    try
      list := TStringList.Create;
      list := Searchfile('E:\Doc\docs\sp');
    finally
      list.Free;
    end;  end;end;
运行在线程下 就提示 内存访问错误  又不是每次都出错。

解决方案 »

  1.   

    sleep下
      

  2.   

    function thtest(): string;
    var
      I: Integer;
    var
      str: string;
      list: TStringList;
    begin
      for I := 0 to 1 do
      begin
        try
          list := TStringList.Create;
          list := Searchfile('E:\Doc\docs\sp');
    // 此处问题,搜索磁盘文件的代码,消耗时间,会未执行完,就执行下一步,过早释放List,出现错误
        finally
          list.Free;
        end;
      end;
    end;释放正在使用的List,线程出现死机。
      

  3.   

    首先,你这个list := TStringList.Create;创建了是没有意义的,因为 Searchfile('E:\Doc\docs\sp')本身就是返回的TStringList,你后面的List.Free的释放的和你创建的没一点关系,其次,你这个线程函数的声明结构也不对,线程函数的结构应该类似如下
    procedure thtest(PMyParam: Pointer);stdcall;而不是你那种样子,具体可以参考MSDN,用你那个样子的话,是无法保证线程每次都执行成功的(偶尔成功,偶尔失败报错就是这个问题),另外你这个内存会泄露很多
    你这个代码这样写很不规范,正确写法应该如下procedure Searchfile(path: string;List: TStringList);
    var
      SearchRec: TSearchRec;
      found: integer;
    begin
      List.Clear;
      found := FindFirst(path + '\' + '*.txt', faAnyFile, SearchRec);
      while found = 0 do
      begin
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and (SearchRec.Attr <> faDirectory) then
          List.Add(path + '\' + SearchRec.Name);
        found := FindNext(SearchRec);
      end;
      FindClose(SearchRec);
    end;procedure thtest(PMyParam: Pointer);stdcall;
    var
      I: Integer;
    var
      str: string;
      list: TStringList;
    begin
      list := PMyParam;
      Searchfile('E:\Doc\docs\sp',List);
    end;var
      ID: DWORD;
      Lst: TStringList;
      Handle: THandle;
    begin
      Lst := TStringList.Create;
      Handle := CreateThread(nil, 0, @thtest, Lst, 0, ID);
      WaitForSingleObject(handle, INFINITE);
      CloseHandle(Handle);
      ShowMessage(Lst.Text);
      Lst.Free;
      

  4.   


    WaitForSingleObject(handle, INFINITE);  开线程就等待  那就只有一条线程  是不会挂  你去掉等待就会挂
      

  5.   

    list := Searchfile('E:\Doc\docs\sp');  这句代码 会异步??  不然怎么会没有执行完就下一步了?
      

  6.   

    自己解决。CSDN 回答也都不对问题出在  IsMultiThread 系统变量如果用API创建线程不会设置   需要自己动手设置 即可