【发布时间】:2011-11-27 18:28:15
【问题描述】:
首先,我不确定允许工作线程禁用控件是否是一个好的设计。但是,我很好奇我可以在不与 GUI 同步的情况下安全地做到这一点吗?
TDataSet 中的代码如下所示:
procedure TDataSet.DisableControls;
begin
if FDisableCount = 0 then
begin
FDisableState := FState;
FEnableEvent := deDataSetChange;
end;
Inc(FDisableCount);
end;
所以看起来很安全。在 EnableControls 的情况下情况会有所不同。但是 DisableControls 似乎只会增加锁定计数器和分配在 EnableControls 期间触发的事件。
你怎么看?
【问题讨论】:
-
如果您不使用数据对齐进行编译,即使
Incby 本身也不是线程安全的。我强烈建议不要使用以某种方式链接到 GUI 控件的任何控件。 -
进一步,考虑以下场景:线程进入,FDisableCount = 0,FDisableState = FState。发生上下文切换,您的主线程减少 FDisableCount 并更改 FDisableState(我想这就是 EnableControls 中会发生的情况,还没有看过)。发生上下文切换,您的线程再次运行,但现在使用错误的 FDisableState。
-
感谢 Lieven 指出这一点。
标签: multithreading delphi synchronization dataset delphi-2009