Короче говоря:
FValue
в вашем TMythread
в принципе будет доступен из всех потоков, но только если им каким-то образом удастся пройти через стену "private
". Так что на самом деле это просто поле объекта, как и любое другое поле объекта.
threadvar
, однако, больше похож на глобальную переменную и также доступен. За исключением того, что каждый поток получает свой собственный экземпляр объявленного threadvar
.
немного больше фона:
Переменная threadvar «создается», когда поток «рождается». Начальный поток фактически даже не нужно запускать с использованием класса TThread
!. (например, вы можете начать новый поток, используя системный вызов winapi)
Некоторое время назад я нашел этот трудный путь, потому что создал утечку памяти, и мне было трудно понять, почему.
Также: вы не можете инициализировать и завершить threadvar
в разделах initialization
/ finalization
декларируемого unit
. Даже внутренние строки и массивы с подсчетом ссылок вызовут утечку памяти при использовании в качестве threadvar, и не будут явно аннулированы потоком-владельцем до того, как поток «умрет».
AFAIK, вы не можете объявить threadvar
внутри class
. Может быть, вы можете создать class threadvar
, но я никогда не пробовал / не нуждался в этом.
ИМО, как правило, "лучший способ", чем использование threadvar
.
Некоторым хорошим началом для использования потоков в delphi является предоставляемая параллельная библиотека delphi или библиотека с открытым исходным кодом OmniThread .