TThread的后代,从主线程访问属性

时间:2009-04-28 17:00:08

标签: multithreading delphi

我有一个类是TThread的后代。我有一些只读的公共属性。如果我的主线程在线程处于活动状态时读取这些值,我会遇到问题吗?

3 个答案:

答案 0 :(得分:8)

如果通过“只读属性”你的意思是TThread后代本身也不会改变它们,并尽快初始化它们,那么不,一切都会好的(只要你确保线程是活着的并且踢无论何时你要求财产价值)。

如果通过“只读属性”表示TThread后代将是唯一更改它们的人,那么您将需要确保主线程在更改时不读取它们(除非它们是原子值,像整数一样。)

答案 1 :(得分:3)

IntegerBooleanCharPointer等基本类型可随时阅读。只有在其他线程无法同时分配新值时,才能安全地读取引用类型,如string,接口和动态数组。例如,使用临界区或Synchronized方法确保线程在主线程读取时不修改该值。

您还必须记住,在您使用它时,您读取的任何值都可能已过期 - 该线程可能在您阅读它的时间和使用它之间写入了新值。

答案 2 :(得分:2)

这取决于属性类型以及可能的访问方法。

type
  TMyThread = class(TThread)
  private
    FIntfield: integer;
  public
    property IntField: integer read FIntField;
  end;

访问此属性不会成为问题,因为访问32位值是原子操作。但是如果属性大于32位或者在主线程访问它时可能会更改的类引用,则会遇到麻烦。