function MyThreadProc(lpParameter: Pointer): DWORD; stdcall;
var
List: TStrings;
begin
List := TStrings(lpParameter);
// populate List as needed...
Result := 0;
end;
...
var
List: TStrings;
H: THandle;
TID: DWORD;
begin
List := TStringList.Create;
try
H := CreateThread(nil, 0, @MyThreadProc, List, 0, TID);
if H = 0 then RaiseLastOSError;
WaitForSingleObject(H, INFINITE);
CloseHandle(H);
// use List as needed...
finally
List.Free;
end;
end;
procedure MyProc(List: TStrings);
begin
// populate List as needed...
end;
...
var
List: TStrings;
begin
List := TStringList.Create;
try
MyProc(List);
// use List as needed...
finally
List.Free;
end;
end;
2条答案
按热度按时间uqcuzwp81#
首先,
IsMutliThread
对CreateThread()
没有影响。其次,对于这种情况,
CreateThread()
有一个lpParameter
参数。它是一个非类型化的Pointer
,因此您可以向线程函数传递任何您想要的东西。在这种情况下,只需传递TStrings
局部变量的值,而不需要传递局部变量的地址,例如:也就是说,创建一个工作线程只是为了立即等待它终止,这是对工作线程的“浪费”。在这种情况下,您也可以完全删除工作线程,直接调用线程函数并等待它返回,最终结果将完全相同-调用者等待,直到
TStrings
被填充-例如:amrnrhlw2#
您应该使用独立于平台的函数
BeginThread
,该函数在内部调用CreateThread
。下面是一个例子
https://www.delphibasics.co.uk/RTL.php?Name=BeginThread