カスタムVCLのみの日付編集コンポーネントを作成しています。 TDateを文字列に変換するSystem.SysUtils.FormatDateTime関数の使用を計画しています。 FormatDateTimeには2つのバージョンがあります.1つはスレッドセーフで、もう1つはバージョンセーフではありません。 VCLはスレッドセーフではないので、スレッドセーフなバージョンを好むべきですか、スレッドセーフではないバージョンを使用するのは大丈夫ですか?VCLコンポーネントでスレッドセーフ機能を使用する必要があります
答えて
TL; DR使用のスレッドセーフバージョン
あなたが非スレッドセーフ版を使用している場合、あなたはスレッドで、同じ非スレッドセーフバージョンを使用することなく、あなたのコンポーネントのいずれかの消費者を拘束します。
これは、任意の手段による不合理な制約ではありません。スレッドセーフではないバージョンを使用することは、メインスレッドから遠く離れたプログラムでは実用的です。だから、プログラムは、最初の場所であなたのコンポーネントがフォールアウトに追いつくためのルールを破る必要があります。それで、コンポーネント作成者は、原則として、消費プログラムについて何も仮定しないようにすべきです。だから、ベストプラクティスはスレッドセーフなバージョンを呼び出すことです。それでは議論はできません。あなたのプログラムは、これらのロケールグローバル変数のスレッドセーフティ問題に関与することはできません。
議論があるかもしれません:)なぜ、非メインスレッドからビジュアルコントロールのメソッドを呼び出すのでしょうか?私は、コントロールによって消費されるスレッドセーフなインターフェイスを受け入れるだろう、メソッドを呼び出したり、ワーカースレッド内からビジュアルコントロールのプロパティアクセサを使用したりすることはできません。私はスレッドセーフであるように視覚コントロールを設計することはありません。そのメソッドのどれかを呼び出さないのは消費者の責任です。 P.S.また、(おそらく)ロケール設定の変更を聞く(コントロールの出力にそのような変更を反映させたい場合)必要があることを追加することもできます。 – Victoria
@Victoriaアプリケーション内の任意のコードがRTL関数を呼び出すことができます。コンポーネントのメソッドである必要はありません。 –
申し訳ありませんが、私はあなたのここでポイントを得ることはありません。そのスレッドセーフでない 'FormatDateTime'オーバーロードは、下位互換性のためにIMHOだけ存在します。そのグローバルフォーマット設定変数へのアクセスは、スレッドセーフとして設計されていなければなりません。私のポイントは、視覚的なコントロールから、それらのいずれかを使用するのを恐れる必要はないということです。カスタマイズ可能なフォーマットを使用したい場合は、スレッドセーフなオーバーロードを使用してください(オプションで、ユーザ設定を反映するために 'WM_SETTINGCHANGE'メッセージを聞いてください)。 – Victoria
呼び出し元がメインスレッドであるため、関数のスレッドセーフでないバリアントを選択しても問題ありません。この場合はどちらかと思われます(コンポーネントの内部に、その関数を呼び出すワーカースレッドを作成せずに、ワーカースレッド内でコントロールを使用しないというルールを遵守すれば、それで安心してください)。
しかし、さらに検討する必要があります。最近のDelphiのバージョンを持っていて、UpdateFormatSettingsプロパティを有効にしておくと、FormatDateTime関数のスレッドセーフでないオーバーロードで使用される、グローバルに宣言された書式設定変数は、ユーザーがシステムのローカル設定を変更したときに更新されます。私はコントロールの通知について何も言えません(出力を更新することができます)。私は今すぐD2009しか手に入れていないので、これらの変更は後で追加されています。
- 1. 私のIBackingStoreはスレッドセーフである必要がありますか?
- 2. PRNGはスレッドセーフである必要がありますか?
- 3. MongoCollection.forEachはスレッドセーフである必要がありますか?
- 4. phpがLinuxサーバで機能する必要があります
- 5. いつインクルード機能を使用する必要がありますか?
- 6. プロンプトダイアログをパスワードリセット機能に使用する必要があります
- 7. スパイが必要ですが、機能があります。
- 8. 機能を追加する必要があります
- 9. jQueryスクロール機能スティッキーヘッダーはスクロールする必要があります
- 10. UIスレッドでマーシャリングされたメソッドはスレッドセーフである必要があります
- 11. Apache Camel - ftpコンポーネント - 絶対パスを使用する必要があります
- 12. コンポーネントをhtmlタグでラップする必要がありますか?
- 13. PDOを使用しているときはaddslashes機能を使用する必要がありますか?
- 14. Spark変換とアクションのロジックはスレッドセーフである必要がありますか?
- 15. サイトメッシュ機能は、より小さいGrailsサイトで使用する必要がありますか?
- 16. 「自己」はなぜ機能パラメータである必要がありますか?
- 17. VS 2010 Professionalで拡張機能を使用できない - 再インストールする必要がありますか?
- 18. カスタム損失機能でbackward()を定義する必要がありますか?
- 19. PLSQLエラー:コンポーネントを宣言する必要があります
- 20. @Viewアノテーションの使用をやめ、Angular 2コンポーネントでのみ@Componentを使用する必要がありますか?
- 21. 機能テストでは、devise_token_authでログインする必要があります
- 22. NTLMでメンバシップサービスを使用する必要があります
- 23. JavaScriptで「プロトタイプ」を使用する必要があります
- 24. RecyclerViewでCursorLoaderを使用する必要がありますか?
- 25. DynamoDBでEC2を使用する必要がありますか?
- 26. OpenCVでワイヤレスカメラを使用する必要があります
- 27. モデルレイヤー(MVP)でアクティビティーリファレンスを使用する必要があります
- 28. Parcel.writeSerializableをParcelable.writeToParcelで使用する必要がありますか?
- 29. フォントでwebpackを使用する必要がありますか?
- 30. /csv:WriteAll()でError()を使用する必要がありますか?
ビジュアルコンポーネントはスレッドセーフではないため、どのコンポーネントを使用しても問題ありません。スレッドからコンポーネントを使用することはできません。 –
オーバーロードはスレッドの安全性だけではありません。これは、グローバル設定に影響を与えずにフォーマット設定をカスタマイズする方法です。コンポーネントが日付/時刻を特定の形式の文字列に変換する必要がある場合は、スレッド化に関係なくオーバーロードを使用します。 –