3

レスポンシブデザインと機能を備えたより良いプログラムを作成することに興味があります。現在、データにリモートでアクセスするプログラムを作成すると、インターフェイスがフリーズし、その状態で動作するアニメーションGIFがありません。

David Heffermanから、VCLがメインスレッドにあるため、VCLで作成されたアニメーションGIFはスレッドでも応答しないと言われました。これは、データベースにも当てはまります。

ここでの私の疑問は、特にデータベースでスレッドを操作する方法です。そのため、それについて多くの質問があります。

データベース全体をスレッド関数とプロシージャに実装する必要がありますか?それが正しければ、コンポーネントをフォームにドロップしてデータベースを使用することはできませんよね?しかし、ユーザー入力とグリッドはどうですか?それらはそれらのスレッドで正しく動作しますか、それともそのコンテンツを挿入/更新sqlコマンドに送信するTEdit代わりに通常のユーザーにする必要がありますか?TDBEdit

ここでの主な目的は、Zeosを使用してMySQLなどのリモートデータベースにアクセスするDelphiアプリケーションを作成することですが、サーバーで行われるコンサルトのすべてのドロップに対してフリーズすることはありません。少なくとも小さいもの。システムがレコードのリストをテーブルにダウンロードし、ユーザーがそれでも入力できるとしたら、それは非常に醜いことです。そのような場合は、アニメーションGIF(または他のソリューション)が機能することを強く望んでいます。

助けてくれてありがとう!

4

1 に答える 1

3

私の経験では、最善のアプローチは、データベースコンポーネントをデータモジュールにドロップしてから、このデータモジュールを各スレッドで動的に作成することです。データベースコンポーネントは、それらを使用しているスレッドで作成および初期化されている場合、通常は正常に機能します。

ただし、注意点があります。Firebirdデータベースに接続している場合は、一度に1つのスレッドのみが接続を確立していることを確認する必要があります。(データベースに接続するコードのクリティカルセクションを使用します。)これはFirebird 1.5、2.0、および2.1にも当てはまりますが、Firebird 2.5ではもう必要ない場合があります(まだテストする機会がありませんでした)。

編集(EASIのコメントへの回答):はい、データベースへの接続には時間がかかる場合があります。短い操作を頻繁に実行する必要がある場合は、スレッドを接続して長時間実行し続けるのが最善です。

そのための2つの方法が考えられます。1)スレッドを存続させて接続し、内部でメッセージループを実行します。このループは、メインスレッドからコマンドを受け取り、それらを処理して結果を返します。2)スレッドを初期化してスレッドプールに接続し、データベース操作を実行する必要があるときにアクティブにします。

基本的に、両方のアプローチは同じですが、違いは「コマンドの受信と処理」ループを処理するレベルにあります。

2番目のアプローチは、メカニズムを使用してOmniThreadLibraryに簡単に実装できますIOmniConnectionPool.SetThreadDataFactory。詳細については、OmniThreadLibraryへの接続プールメカニズムの追加とデモ24_ConnectionPoolを参照してください。または、高レベルの抽象化バックグラウンドワーカーを使用して、タスク初期化ブロックでスレッドごとにデータベース接続を確立することもできます。

于 2013-03-22T16:46:03.703 に答える