Потомок TThread, доступ к свойствам из основного потока - PullRequest
3 голосов
/ 28 апреля 2009

У меня есть класс, который является потомком TThread. У меня есть некоторые общедоступные свойства, которые только для чтения. Буду ли я сталкиваться с проблемами, если мой основной поток считывает эти значения, когда поток активен?

Ответы [ 3 ]

8 голосов
/ 28 апреля 2009

Если под «свойствами только для чтения» вы имеете в виду, что сам потомок TThread никогда не изменяет их, а инициализирует их как можно скорее, тогда нет, все будет хорошо (если вы убедитесь, что поток жив и работает) всякий раз, когда вы запрашиваете значения свойств).

Если под «свойствами только для чтения» вы имеете в виду, что потомок TThread будет единственным, кто их изменяет, вам нужно будет убедиться, что основной поток не читает их во время их изменения (если только они не являются атомарными значениями, как целые числа).

3 голосов
/ 28 апреля 2009

Основные типы, такие как Integer, Boolean, Char и Pointer, безопасны для чтения в любое время. Ссылочные типы, такие как string, интерфейсы и динамические массивы, безопасны для чтения, только если нет шансов, что другой поток может одновременно назначить новое значение. Используйте критический раздел или метод Synchronized, например, чтобы убедиться, что поток не изменяет значение, пока основной поток читает из него.

Вы также должны помнить, что любое прочитанное вами значение может устареть к тому времени, когда вы его используете - поток мог записать новое значение между временем, когда вы его прочитали, и временем, когда вы его используете.

2 голосов
/ 28 апреля 2009

Это зависит от типов свойств и, возможно, от методов доступа к ним.

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

Доступ к этому свойству не будет проблемой, так как доступ к 32-битным значениям является атомарной операцией. Но если свойство больше 32-разрядного или ссылка на класс может быть изменена во время доступа к нему основного потока, у вас возникнут проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...