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

uwopmtnx  于 2022-10-16  发布在  其他
关注(0)|答案(2)|浏览(321)

我想知道如何将TStrings对象(在堆IIRC上分配)的本地对象地址从调用函数传递给我用CreateThread()创建的线程。线程有无限的等待,因此对象在调用方级别应该仍然可用,等待信息填充。
我希望保持与Win32相关,而不是使用VCL TThread类来处理这类事情。
有谁有这样做的例子吗?在调用CreateThread() API之前,IsMutliThread已设置为True。我只想利用将TStrings变量的地址直接传递给工作线程。

uqcuzwp8

uqcuzwp81#

首先,IsMutliThreadCreateThread()没有影响。
其次,对于这种情况,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;

也就是说,创建一个工作线程只是为了立即等待它终止,这是对工作线程的“浪费”。在这种情况下,您也可以完全删除工作线程,直接调用线程函数并等待它返回,最终结果将完全相同-调用者等待,直到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;
amrnrhlw

amrnrhlw2#

您应该使用独立于平台的函数BeginThread,该函数在内部调用CreateThread
下面是一个例子
https://www.delphibasics.co.uk/RTL.php?Name=BeginThread

相关问题