在Delphi中,“ Threadvar”(每个线程可用的变量的私有副本)与在“线程”的“私有”部分中声明的变量之间的区别是什么:
TMyThread = class (TThread)
private
FValue: integer
...
end;
在以后的情况下,每个线程也应该有一个单独的FValue副本。
答案 0 :(得分:1)
简而言之:
您的FValue
中的TMythread
将原则上可以从所有线程访问,但前提是它们必须设法通过“ private
”墙。因此它实际上只是一个对象字段,就像其他任何对象字段一样。
threadvar
更像是全局变量,并且同样可以访问。除了每个线程都有自己的声明的threadvar
实例之外。
更多背景信息:
当线程“出生”时,将“创建” threadvar变量实际上,甚至不必使用TThread
类来启动启动线程! (例如,您可以使用winapi系统调用来启动新线程)
不久前,我很难找到答案,因为我造成了内存泄漏,并且很难找出原因。
另外:您不能在声明threadvar
的{{1}} / initialization
部分中初始化和完成finalization
的操作。甚至内部使用的,引用计数的字符串和数组在用作threadvar时也会造成内存泄漏,并且不会在线程“死”之前被拥有的线程显式取消。
自动操作您无法在unit
内声明threadvar
。也许您可以创建一个class
,但是我从未尝试过/不需要它。
IMO通常比使用class threadvar
有“更好的方法”。
在提供的delphi parallel library或开放源代码OmniThread library中,在delphi中使用线程是一个很好的开始。