首先,我不確定允許工作線程禁用控件是一個好設計。但是,我很好奇,我可以安全地做到這一點,沒有與GUI同步?我可以在工作線程中執行TDataSet.DisableControls而不用Synchronize()包裝它嗎?
在TDataSet的代碼看起來是這樣的:
procedure TDataSet.DisableControls;
begin
if FDisableCount = 0 then
begin
FDisableState := FState;
FEnableEvent := deDataSetChange;
end;
Inc(FDisableCount);
end;
所以看起來安全的時候。 EnableControls的情況會有所不同。但DisableControls似乎只增加鎖定計數器並分配在EnableControls期間觸發的事件。
您認爲如何?
即使'Inc'本身不是線程安全的,如果你不用數據對齊編譯。我強烈建議不要使用任何與GUI控件相關的控件**。 –
此外,請考慮以下方案:線程進入,FDisableCount = 0,FDisableState = FState。上下文切換髮生時,您的主線程遞減FDisableCount並更改FDisableState(我想這就是EnableControls中會發生的情況,沒有看過)。上下文切換髮生,您的線程再次運行,但現在使用錯誤的FDisableState。 –
謝謝你指出了列文。 – Wodzu