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;
運行在執行緒下 就提示 記憶體訪問錯誤 又不是每次都出錯。
uj5u.com熱心網友回復:
執行緒別用回圈uj5u.com熱心網友回復:
為什么? 問題是需要回圈啊
uj5u.com熱心網友回復:
sleep下uj5u.com熱心網友回復:
一樣會掛
uj5u.com熱心網友回復:
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,執行緒出現死機。
uj5u.com熱心網友回復:
首先,你這個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;
uj5u.com熱心網友回復:
WaitForSingleObject(handle, INFINITE); 開執行緒就等待 那就只有一條執行緒 是不會掛 你去掉等待就會掛
uj5u.com熱心網友回復:
list := Searchfile('E:\Doc\docs\sp');
這句代碼 會異步?? 不然怎么會沒有執行完就下一步了?
uj5u.com熱心網友回復:
自己解決。CSDN 回答也都不對
問題出在 IsMultiThread 系統變數
如果用API創建執行緒不會設定 需要自己動手設定 即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59093.html
上一篇:如何自動點擊彈窗,謝謝
