在 Delphi 中将 TStrings 对象传递给辅助线程

Way*_*ght 1 delphi winapi multithreading tstringlist

我想知道如何将TStrings对象的本地对象地址(分配在堆上,IIRC)从调用函数传递到我使用CreateThread(). 该线程具有无限等待,因此该对象应该在调用者级别仍然可用,等待填充信息。

我想保持这个 Win32 相关,而不是使用 VCLTThread类来做这样的事情。

有人有如何执行此操作的示例吗?IsMutliThread已设置为 API 调用True之前CreateThread()。我只想利用将TStrings变量的地址直接传递给工作线程。

Rem*_*eau 5

首先,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)