gpt4 book ai didi

multithreading - 将 ThreadFunction 传递给 CreateThread API 的正确方法是什么

转载 作者:行者123 更新时间:2023-12-03 19:31:03 24 4
gpt4 key购买 nike

先定义:

uses
Windows;

type
TThreadParams = record
FParam1 : Integer;
FParam2 : array [0..511] of Byte;
end;

TFoo = class
private
FThreadHandle: THandle;
FThreadID : Cardinal;
FSomeParameters: TThreadParams;

function procInObject(const Params: Pointer): DWord; stdcall;
public
procedure CreateObjThread;
end;

function procInInterface(const Params: Pointer): DWord; stdcall;

implementation

function procInInterface(const Params: Pointer): DWord;
begin
Result := High(Cardinal);

while True do
begin
//Do something with Params
end;
end;

{ TFoo }

procedure TFoo.CreateObjThread;
begin
FThreadHandle := CreateThread(nil, 0, @procInInterface, @FSomeParameters, CREATE_SUSPENDED, FThreadID);

//FThreadHandle := CreateThread(nil, 0, @procInObject, Self, CREATE_SUSPENDED, FThreadID);
end;

function TFoo.procInObject(const Params: Pointer): DWord;
begin
Result := High(Cardinal);

while True do
begin
//Do something with Params
end;
end;

现在,如您所见,我正在尝试使用 WinAPI 创建一个匿名线程。我不想使用 TThread 类或像 Omni 这样的库。

问题是当我这样做时
procedure TFoo.CreateObjThread;
begin
FThreadHandle := CreateThread(nil, 0, @procInInterface, @FSomeParameters, CREATE_SUSPENDED, FThreadID);

//FThreadHandle := CreateThread(nil, 0, @procInObject, Self, CREATE_SUSPENDED, FThreadID);
end;

代码编译,当我这样做时
procedure TFoo.CreateObjThread;
begin
//FThreadHandle := CreateThread(nil, 0, @procInInterface, @FSomeParameters, CREATE_SUSPENDED, FThreadID);

FThreadHandle := CreateThread(nil, 0, @procInObject, Self, CREATE_SUSPENDED, FThreadID);
end;

它没有。编译器说“[DCC 错误] Unit1.pas(45): E2036 需要变量”。所以出现了一个问题;为了实现我想要的,我是否必须使用在 Unit 接口(interface)中声明的一些方法而不是对象的类?有什么收获 procIn接口(interface)一个变量和 过程对象 不是吗?

另一方面,它能够编译
procedure TFoo.CreateObjThread;
begin
FThreadHandle := CreateThread(nil, 0, @TFoo.procInObject, Self, CREATE_SUSPENDED, FThreadID);
end;

但这对我来说似乎不合适。这种方式是否会导致 TFoo 的所有实例对 使用相同的代码块?过程对象 而不是拥有自己的代码块?我哪里错了?

最佳答案

您认为多个线程运行同一代码块是不合适或错误的,这是错误的。这绝对没问题,而且经常这样做。代码(除非自修改)本质上是线程安全的。

不知道为什么你需要一个单独的记录/类作为线程参数,而不是简单地使用 TFoo 的字段,但我想这是你的设计:)。

将“ProcInInterface”中的参数转换回 TFoo,你应该没问题。

您可能意识到在释放 TFoo 时需要小心,要么确保线程被终止(可能在它的 d'tor 中),要么从不显式释放它并允许操作系统在应用程序关闭时终止它。

您对 TThread 类有什么看法(除了您不必使用的可怕的同步/WaitFor/OnTerminate)?

关于multithreading - 将 ThreadFunction 传递给 CreateThread API 的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21628150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com