【问题标题】:Can I read properties of a VCL control in a non-GUI thread?我可以在非 GUI 线程中读取 VCL 控件的属性吗?
【发布时间】:2013-01-06 19:27:08
【问题描述】:

如果线程从 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;

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

【问题讨论】:

  • 正如大卫所说,直接处理 vcl 并不安全。在上面的链接中,vcl 控件的状态存储在一个变量中。在这种情况下,它是一个布尔值,这是安全的。但其他类型可能不安全。

标签: delphi asynchronous thread-safety


【解决方案1】:

不,这不安全。您的代码可能会导致创建的窗口句柄与错误的线程有关联。

不要使用 GUI 来存储您的应用程序状态。使用 GUI 显示该状态的视图。一旦你将状态与视图分开,你就回家了。您的工作线程无需接触 GUI 即可使用底层状态状态。

【讨论】:

  • 那么我需要使用Synchronize方法吗?
  • 你可以,但正如我所说,你最好不要触摸 GUI。您的基础模型对象应该保持状态。从那里阅读它。不要将你的状态保存在 GUI 对象中。
  • 使用答案中描述的方法解决问题。将应用程序的状态保存在通常称为视图的对象中。让您的 GUI 成为该模型的视图。当用户在 GUI 中进行更改时,将这些更改推送到模型。然后你的工作线程不需要接触 VCL,你的问题就会消失。阅读模型-视图-控制器。
  • 调用方法,分配给属性等。没什么特别的,只是简单的 Delphi OOP 编码。
  • 当复选框状态发生变化时,为什么不简单地从 gui 线程向线程发送(发布)消息?
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2014-05-28
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多