VCL组件应该使用线程安全功能吗?

时间:2017-08-06 01:55:44

标签: multithreading delphi thread-safety custom-component

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

2 个答案:

答案 0 :(得分:2)

tl; dr 使用threadsafe版本

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

任何措施都不是不合理的约束。使用非线程安全版本只能在一个永远不会远离主线程的程序中使用。因此,程序必须首先违反规则,以使组件陷入影响。

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

答案 1 :(得分:1)

如果您选择函数的非线程安全变体,那么调用者将成为主线程,这并不重要。在这种情况下似乎是(如果你没有在你的组件内部创建一个工作线程,你从中调用该函数,并且你遵守你在任何工作线程中使用你的控件的规则,你和#39;安全的。)

但还有更多要考虑的问题。如果您有最新的Delphi版本并且启用了UpdateFormatSettings属性,那么当用户修改其系统上的本地设置时,FormatDateTime函数的非线程安全重载中使用的全局声明的格式设置变量将会更新。我无法对控制通知做任何说明(因此您可以更新输出),因为我现在手动只有D2009,这些更改已在以后添加。