我刚刚在文档中发现FloatToStr
and DateToStr
它们的单参数重载不是线程安全的。原因是它们访问存储在全局变量中的本地化信息。
我的问题是:如果我不在运行时更改格式设置,这有任何实际意义吗?据我了解,只要每个人都只读取格式设置(即使是从多个线程),我就是安全的。
这是真的还是我在这里遗漏了一些东西?
Thanks.
FloatToStr、DateToStr 和其他类似函数正在读取全局格式设置。因此,如果您的应用程序不更改这些函数调用的这些设置,那么它就是线程安全的。相反的以下代码不是线程安全的:
DecimalSeparator := ',';
try
s := FloatToStr(123.45);
finally
DecimalSeparator := '.';
end;
当您需要胎面安全和“本地”格式设置时,您必须使用重载函数,该函数采用最后一个参数:AFormatSettings:TFormatSettings。因此,为了使上面的代码线程安全,你必须编写:
var
fs: TFormatSettings;
GetLocaleFormatSettings(GetThreadLocale, fs);
fs.DecimalSeparator := ',';
s := FloatToStr(123.45, fs);
Notes:
- GetLocaleFormatSettings 和 fs 初始化可能会被调用一次,然后 fs 可能会被多次使用。这将加快代码速度。
- 可以使用 TFormatSettings.Create 代替 GetLocaleFormatSettings。我不确定它是什么时候引入的,但我在 Delphi XE 中看到了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)