我可以在非GUI线程中读取VCL控件的属性吗?

use*_*126 6 delphi asynchronous thread-safety

如果一个线程异步读取Delphi中VCL控件的信息,那么线程是否安全?

例如.

procedure TMyThread.Execute;
var bOK:Boolean; 
    iOK:Integer;
begin
   while not terminated do
   begin
      bOk:=MyForm.cbCheckBox.Checked;
      iOK:=MyForm.Left;
      sleep(20);
   end;
end;
Run Code Online (Sandbox Code Playgroud)

如果它不是线程安全的,我应该如何在复选框更改其属性时捕获事件.

Dav*_*nan 11

不,这不安全.您的代码可能导致窗口句柄与错误的线程相关联.

不要使用GUI来存储应用程序状态.使用GUI显示该状态的视图.一旦你将状态与视图分开,你就回家了.您的工作线程可以使用基础状态而无需触及GUI.

  • 嗯,你可以,但正如我所说,你最好不要触摸GUI.您的基础模型对象应该保持状态.从那里读取它.不要在GUI对象中保持状态. (2认同)