gpt4 book ai didi

delphi - Delphi-TThread可以更改VCL主线程中变量的值吗?

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

使用:Windows VCL窗体应用程序Delphi XE2

TThread在其执行期间是否可以更改VCL主线程中变量的值?

需要更新一个声明为TForm类的字段的Integer。它会在重载(并重新引入)Create构造函数方法中作为var变量传递给TThread。

这有任何后备之处吗?

最佳答案

是的,线程可以修改变量。变量不属于线程。变量可以属于表单或线程对象,但是线程对象(即TThread的实例或其后代)与OS执行线程不同。

对象可以具有在多个线程中运行的代码。您的TThread.Create方法在调用它的线程的上下文中运行,该线程通常是您的主线程。另一方面,Execute方法在创建的OS线程的上下文中运行。但是显然,这两种方法都可以访问TThread对象的字段,从而回答了两个OS线程是否可以访问同一变量的问题。

但是,您将无法以描述的方式访问form变量。将其作为var参数传递给构造函数将允许构造函数对其进行修改,但是如上所述,构造函数不会在新的OS线程的上下文中运行。为了允许新线程访问该变量,您需要存储一个指向它的指针,而不是通过引用传递它。例如:

type
TSteveThread = class(TThread)
private
FVariable: PInteger;
protected
procedure Execute; override;
public
constructor Create(Variable: PInteger);
end;

constructor TSteveThread.Create;
begin
inherited Create(False);
FVariable := Variable;
end;

procedure TSteveThread.Execute;
begin
// Access FVariable^ here.
end;


像这样创建它:

procedure TSteveForm.ButtonClick;
begin
TSteveThread.Create(@Self.Variable);
end;


一种替代方法是改为将引用传递给表单,然后通过该引用访问表单的字段。例如:

type
TSteveThread = class(TThread)
private
FForm: TSteveForm;
protected
procedure Execute; override;
public
constructor Create(Form: TSteveForm);
end;

constructor TSteveThread.Create;
begin
inherited Create(False);
FForm := Form;
end;

procedure TSteveThread.Execute;
begin
// Access FForm.Variable here.
end;


像这样创建它:

procedure TSteveForm.ButtonClick;
begin
TSteveThread.Create(Self);
end;


无论哪种情况,您都需要采取通常的预防措施来控制多个线程同时访问数据。底线是两个线程都可以访问数据。

关于delphi - Delphi-TThread可以更改VCL主线程中变量的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28313758/

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