Way*_*ght 1 delphi winapi multithreading tstringlist
我想知道如何将TStrings对象的本地对象地址(分配在堆上,IIRC)从调用函数传递到我使用CreateThread(). 该线程具有无限等待,因此该对象应该在调用者级别仍然可用,等待填充信息。
我想保持这个 Win32 相关,而不是使用 VCLTThread类来做这样的事情。
有人有如何执行此操作的示例吗?IsMutliThread已设置为 API 调用True之前CreateThread()。我只想利用将TStrings变量的地址直接传递给工作线程。
首先,IsMutliThread对 没有影响CreateThread()。
其次,CreateThread()有一个lpParameter适合这种情况的参数。它是一个无类型的Pointer,所以你可以将任何你想要的东西传递给你的线程函数。在这种情况下,您可以简单地传递局部变量的值TStrings,不需要传递局部变量的地址,例如:
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;
Run Code Online (Sandbox Code Playgroud)
话虽如此,创建一个工作线程只是为了立即等待它终止是对工作线程的浪费。在这种情况下,您也可以完全删除工作线程并直接调用线程函数并等待它返回,最终结果将完全相同 - 调用者等待直到填充TStrings- 例如:
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;
Run Code Online (Sandbox Code Playgroud)