繁体   English   中英

我可以在工作线程中执行TDataSet.DisableControls而不用Synchronize()包装它吗?

[英]Can I execute TDataSet.DisableControls in worker thread without wrapping it with Synchronize()?

首先,我不确定允许工作线程禁用控件是一个好的设计。 但是,我很好奇,如果不与GUI同步,我可以安全地做到吗?

TDataSet中的代码如下所示:

procedure TDataSet.DisableControls;
begin
  if FDisableCount = 0 then
  begin
    FDisableState := FState;
    FEnableEvent := deDataSetChange;
  end;
  Inc(FDisableCount);
end;

所以看起来很安全。 在EnableControls的情况下,情况会有所不同。 但是,DisableControls似乎只会增加锁定计数器并分配在EnableControls期间触发的事件。

你怎么看?

这样做看起来很安全,但事情可能会出错,因为这些标志用于代码中,这些代码可能在您从线程调用此方法时正在执行。

我会将调用同步到DisableControls,因为只有在没有控件使用它时,您希望线程开始使用此数据集。 对EnableControls的调用也可以同步,或者您可以使用PostMessage将消息发布到表单。 这样,线程就不必等待主线程了。

但我的直觉告诉我,对于GUI和线程根本不使用相同的数据集可能会更好。

没有查找实际代码:它可能是安全的,只要你可以确定主线程当前不访问FDisableCount,FDisableState和FEnableEvent。 这里有可能出现竞争状况。

我仍然建议您从主线程中调用DisableControls。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM