TThreadList和" with"声明

时间:2015-05-15 10:00:58

标签: multithreading delphi thread-safety locking

关于如何使用TThreadList的简短问题。与"和#34;一起使用是否安全?声明如下:

  with FEngineList.DAQEngines.LockList do
  begin
    try
      for Idx := 0 to Count - 1 do
        Items[idx].Param1 := cos(2*pi*I/Count);
      ...
      ...
    finally
      FEngineList.DAQEngines.UnlockList;
    end;
  end;

或者我应该像这里一样明确地这样做:

  uEngines := FEngineList.DAQEngines.LockList;
  try
    with uEngines do
    begin
      for Idx := 0 to Count - 1 do
        Items[idx].Param1 := cos(2*pi*I/Count);
      ...
      ...
    end;
  finally
    FEngineList.DAQEngines.UnlockList;
  end;

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以选择哪种变体。 with只有告诉编译器在您的代码中获取成员的位置。所以,是的,只要您正在访问您想要的成员,它就是安全的。它不会影响运行时。

我更喜欢第一种方式,只是没有begin..end阻止(如果我强制使用with),但它是只是我个人的偏好,你可以随心所欲地写出来:

with FEngineList.DAQEngines.LockList do
try
  ...
finally
  FEngineList.DAQEngines.UnlockList;
end;

答案 1 :(得分:2)

不建议使用任何变体。如果你必须在这两者之间做出选择,那么前者是更好的,因为不需要额外的局部变量。

但是,应避免使用with。问题在于引入了范围重叠的可能性。如果原始范围和作为with主题的对象具有相同名称的成员,则with范围会隐藏外部范围。当您将新成员添加到恰好与外部作用域成员同名的with主题时,这会引发您的注意。充其量你的程序将无法编译。在最坏的情况下,它编译,你有一个缺陷。很可能是你不容易发现的缺陷。

像这样编码:

uEngines := FEngineList.DAQEngines.LockList;
try
  for Idx := 0 to uEngines.Count - 1 do
    uEngines.[Idx].Param1 := Cos(2*pi*Idx/uEngines.Count);
    ....
  end;
finally
  FEngineList.DAQEngines.UnlockList;
end;

相关:Is Delphi "with" keyword a bad practice?