VCL 组件是否应该使用线程安全函数

Should VCL Components Use Thread-Safe Functions

我正在开发自定义 VCL 专用日期编辑组件。我计划使用 System.SysUtils.FormatDateTime 函数将 TDate 转换为字符串。 FormatDateTime 有两个版本——一个是线程安全的,另一个不是。由于 VCL 不是线程安全的,我应该更喜欢线程安全版本还是非线程安全版本可以使用?

只要调用者是主线程,选择函数的非线程安全变体都没关系。在这种情况下似乎是(如果你没有在你的组件内部创建一个你调用该函数的工作线程,并且你遵守你不会在任何工作线程内使用你的控件的规则,你会放心使用)。

但还有更多需要考虑的问题。如果您有最新的 Delphi 版本并保持 UpdateFormatSettings property enabled, a globally declared format settings variable used in non thread safe overload of the FormatDateTime 功能将在用户修改其系统上的本地设置时得到更新。我不能说任何关于控制通知的信息(所以你可以更新输出)因为我现在只有 D2009 并且这些更改是稍后添加的。

tl;dr 使用线程安全版本

如果您使用非线程安全版本,那么您将限制组件的任何使用者不要在线程中使用相同的非线程安全版本。

无论以何种标准衡量,这都不是不合理的限制。使用非线程安全版本只有在永远不会离开主线程的程序中才真正可行。因此,程序必须首先违反规则,您的组件才会被卷入后果。

话虽如此,作为一个原则,组件作者应该避免对消费程序做出任何假设。所以最好的做法是调用线程安全版本。那么就无法辩论了。您的程序不能涉及这些区域设置全局变量的任何线程安全问题。