4

DbExpress コンポーネントを使用して Delphi で「GUI」データベース アクセスしか実行したことがありませんが、バックグラウンドで 1 つのクエリを実行したいと考えています。その TSQLConnection がスレッドセーフではない場所をいくつか読んだので、スレッドごとに新しい接続を作成する必要があります。TSQLConnection に CloneConnection があることがわかりますが、新しい接続は元の接続によって所有されていると主張しています。

そう、

1)スレッド化されたデータモジュールにあるTSQLQueryを実行する適切な方法は何ですか?

2) TSQLConnection.CloneConnection を使用できますか? 複製された接続を解放するか、スレッドが終了したときにそのままにしておく必要がありますか?

簡単なサンプル コード (または URL) は非常に役立ちます。

4

1 に答える 1

5

これは DbExpress (私は経験がありません) に固有のものではありませんが、いくつかの機能をバックグラウンド スレッドに移動するための最良のアイデアは、最初にメイン スレッドで開発し、デバッグし、正常に動作していることを確認したら、移動します。

できることは、すべてを TDataModule に入れることです。データ モジュールが単独で機能し、他のフォームやデータ モジュールの他のコンポーネントを必要とせず、バックグラウンド スレッドで作成する場合、確実に機能します。接続は、データベースへのすべてのアクセスが実行される同じスレッドで作成および破棄されるため、クローンを作成する必要はありません。

データベースがバックグラウンド スレッドで動作するための重要なヒント:

  • セカンダリ スレッドで未処理の例外が発生すると、アプリケーションがクラッシュする可能性があるため、すべての例外を処理します。Application オブジェクトでの例外処理は機能しません。

  • GUI スレッドでは何もアクセスしないでください。つまり、最も重要なことは、TDataSource が使用できず、データに依存するコントロールを使用できないことです。

  • 使用するコンポーネントが SendMessage または PostMessage で何らかの処理を行う場合、バックグラウンド スレッドで標準のメッセージ ループを作成する必要があります。

  • 使用するコンポーネントが OLE で何らかの処理を行う場合は、バックグラウンド スレッドのコンテキストで OleInitialize() と OleUnitialize() の両方を呼び出します。

作業を楽にしたい場合は、OmniThreadLibraryまたはAsyncCallsの使用を検討してください。バックグラウンド データベース接続が存続する期間と、それらを再利用するかどうかによって異なります。

于 2009-02-03T12:00:32.077 に答える