作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用: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/
我是一名优秀的程序员,十分优秀!