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;
运行在线程下 就提示 内存访问错误 又不是每次都出错。
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,线程出现死机。
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;
WaitForSingleObject(handle, INFINITE); 开线程就等待 那就只有一条线程 是不会挂 你去掉等待就会挂