我正在使用自定義VCL日期編輯組件。我計劃使用System.SysUtils.FormatDateTime函數將TDate轉換爲字符串。 FormatDateTime有兩個版本 - 一個是線程安全的,另一個不是。由於VCL不是線程安全的,我應該更喜歡線程安全版本還是非線程安全版本可以使用?VCL組件應該使用線程安全函數
回答
TL;博士使用線程版本
如果使用非線程版本,那麼你限制你的組件的任何消費者不能在一個線程中使用相同的非線程版本。
這不是任何措施的無理限制。使用非線程安全版本在一個永遠不會離開主線程的程序中才真正可行。所以一個程序必須首先打破規則,才能讓你的組件陷入沉重的後果。
儘管如此,組件作者應該作爲一個原則避免對消費程序做出任何假設。所以最好的做法是調用線程安全版本。那麼就不存在爭議。您的程序不能涉及任何線程安全問題與這些語言環境全局變量。
可以有辯論:)爲什麼要從非主線程調用一個可視化控件的方法?我會接受控件使用的線程安全接口,而不是在工作線程中調用方法或使用可視控件的屬性訪問器。我永遠不會設計我的視覺控制線程安全。只是消費者的責任是不調用任何方法。附:您可能還會補充說,您應該(最有可能)監聽區域設置更改(如果您想在控制的輸出中反映這種更改)。 – Victoria
@Victoria應用程序中的任何代碼都可以調用RTL函數。它不一定是組件的一種方法。 –
對不起,我不明白你的意思。這種非線程安全的'FormatDateTime'重載僅僅爲了向後兼容而存在。對全局格式設置變量的訪問應該被設計爲線程安全是另一點。我的觀點是,從視覺控制你不需要害怕使用它們中的任何一個。如果你想有一個可定製的格式,使用線程安全重載(如果你決定的話,可以選擇收聽'WM_SETTINGCHANGE'消息來反映用戶設置)。 – Victoria
只要調用者將成爲主線程,如果您選擇函數的非線程安全變體,則無關緊要。在這種情況下,似乎是這樣的(如果您不是在組件內部創建一個工作線程,您從中調用該函數,並且您堅持不會在任何工作線程中使用您的控件的規則,那麼您會與它一起安全)。
但還有更多要考慮。如果你有最新的Delphi版本並且保持UpdateFormatSettings屬性的啓用,當用戶修改其系統上的本地設置時,用於FormatDateTime函數的非線程安全超載的全局聲明格式設置變量將得到更新。我無法說出任何關於控制通知的信息(因此您可以更新輸出),因爲我現在隻手持D2009,並且稍後會添加這些更改。
- 1. objective C我應該怎樣做這些函數線程安全?
- 2. strtok函數線程安全
- 3. 使用「不安全」線程函數是否安全?
- 4. java數組線程安全
- 5. ClassLoader應該是線程安全的嗎?
- 6. 類應該是線程安全的嗎?
- 7. 爲什麼std :: queue :: empty()不是線程安全的?不應該const函數是線程安全的?
- 8. 線程安全訪問數組和線程安全訪問
- 9. 線程安全應用程序中的線程安全
- 10. 在C中爲OpenMP使線程安全函數安全
- 11. 應調用公共共享函數爲線程安全鎖定
- 12. 我應該爲我的目的使用線程安全還是非線程安全的Singleton類?
- 13. 線程安全和靜態函數
- 14. 線程安全回調函數
- 15. C++成員函數線程安全
- 16. 如何檢查線程安全函數?
- 17. perl gmtime函數線程安全
- 18. 執行線程安全ctime函數
- 19. 是否是setlocale線程安全函數?
- 20. INDY 10 TCP服務器 - 結合非線程安全VCL代碼
- 21. 使用線程安全庫
- 22. 線程安全使用CallContext.LogicalSetData
- 23. 使用線程安全或非線程安全的PHP?
- 24. 彈簧組件字段線程安全
- 25. TEventLog組件是否線程安全?
- 26. 如何在控制檯應用程序中使用vcl組件?
- 27. D中數組的線程安全性?
- 28. C#數組是否線程安全?
- 29. 數組中的線程安全容器
- 30. 線程安全,應用程序設計
可視化組件不是線程安全的,所以使用哪個並不重要。該組件不能在線程中使用。 –
過載不僅僅是線程安全。更多的是在不影響全局設置的情況下自定義格式設置。如果您的組件需要將日期/時間轉換爲特定格式的字符串,請使用重載,而不管線程。 –