1

DBに接続し、データベースからデータを繰り返し(1分間隔で)読み取るアプリケーションを作成しています。これは RSS フィード リーダーのようなものですが、ローカル DB を備えています。データの読み取りに失敗した場合は、接続を再確立しようとします。フォームに配置された TADOConnection と TADOQuery を使用して設計しました (したがって、動的な作成はありません)。私の目的は、ユーザーの観点からアプリケーションを「生きている」状態に保つことです。そのため、接続部分と読み取り部分を 1 つのスレッドに配置しました。問題は、それを最善の方法で行う方法です。

私のデザインは次のようになります。

  • アプリケーションの起動時に、フォームとともに TADOConnection と TADOQuery が作成されます。
  • 別のスレッドで接続を開く (TADOConnection)
  • 接続が確立された場合は、接続スレッドを一時停止し、フォームでタイマーを開始します。これにより、データ読み取りのために別のスレッドが定期的に再開されます
  • 読み取りスレッドが成功した場合、何も起こらずフォーム タイマーが続行されます。失敗した場合、スレッドはタイマーを停止し、接続スレッドを再開します。

TADOConnection または TADOQuery を動的に作成する方が良いですか、それとも問題ではありませんか? たとえば、スレッド内のクリティカル セクションなどを使用する方がよいでしょうか (同時にコンポーネントにアクセスできるのは 1 つだけで、スレッドは 1 つだけです)。

ご提案いただきありがとうございます

4

2 に答える 2

8

この質問はかなり主観的であり、おそらく閉じるには十分主観的ではありませんが、とにかく主観的です。動的に作成されたADOオブジェクトを選択する理由は次のとおりです。

  • コードとコードへのアクセスに使用されるオブジェクトなど、すべてをまとめます。フォーム上に作成されたデータアクセスオブジェクトを使用するには、スレッドがフォームの内部動作についての深い知識を持っている必要がありますが、これは決して良い考えではありません。
  • 他のスレッド(メインVCLスレッドを含む)からこれらのオブジェクトにアクセスできないため、より安全です。もちろん、これらの接続を他の目的で使用することは計画していません。複数のスレッドなどを使用することも計画していませんが、いつかこれらの制限を忘れてしまうかもしれません。
  • 将来性があります。他のプロジェクトの同じスレッドを使用することをお勧めします。同じアプリに他のデータにアクセスする2番目のスレッドを追加することもできます。
  • コードから動的にデータアクセスオブジェクトを作成することを個人的に好みます。はい、主観的な質問に対する主観的な答えです。
于 2011-02-14T15:27:34.883 に答える
1

スレッド内のすべてを実行します。DB接続を開き、データを読み取り、それをメインスレッドに「ポスト」してから切断するスレッドに定期的なタイマーを用意します。スレッドは、タイマーによって通知された場合でも、時間を待っている間、たとえば Windows で「スリープ」する必要があります。スレッドに対してローカルでプライベートな DB コンポーネントは、スレッドの実行が開始されたとき (アプリケーションの起動時) にスレッド内で作成され、スレッドの実行が終了したとき (アプリケーションのシャットダウン時) に解放されます。これは、DB 接続が一時的に利用可能かどうかに関係なく常に機能し、メインスレッドは「DB スレッド」と通信する必要さえありません。これは私が常に使用するアーキテクチャであり、完全に防弾です。

于 2011-02-20T09:36:23.410 に答える