14

TDataSet を独自のスレッドで非同期に開くことができるようにして、それが完了するまでメイン VCL スレッドを続行し、その後メイン VCL スレッドがその TDataSet から読み取れるようにしたいと考えています。私はいくつかの実験を行い、いくつかの非常に奇妙な状況に陥ったので、誰かが前にこれをやったことがあるかどうか疑問に思っています.

TDataSet が別のスレッドで作成され、開かれてからデータが読み取られるサンプル アプリをいくつか見てきましたが、それはすべて別のスレッドで行われます。他のスレッドがデータ ソースを開いた後、メイン VCL スレッドから TDataSet を読み取っても安全かどうか疑問に思っています。

TDataSet の子孫としてDAC for MySQL のTmySQLQuery を使用して、Delphi 7 で Win32 プログラミングを行っています。

4

6 に答える 6

5

データセットを独自のスレッドでのみ使用する場合は、同期を使用して、他のコンポーネントと同様に、VCL/UI の更新のためにメイン スレッドと通信することができます。
または、独自のメッセージング システムを使用してメインスレッドとワーカー スレッド間の通信を実装することもできます。

ここで、Hallvard のスレッド化ソリューションを確認してください:
http://hallvards.blogspot.com/2008/03/tdm6-knitting-your-own-threads.html

またはこの他のもの:
http://dn.codegear.com/article/22411

同期とその非効率性についての説明:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

于 2008-09-17T08:28:46.607 に答える
4

TDataSet の他の実装、つまりAstaコンポーネントでそれが行われるのを見てきました。これらはサーバーに接続し、すぐに戻り、データがロードされるとイベントを発生させます。

ただし、コンポーネントに大きく依存すると思います。たとえば、これらの同じ Asta コンポーネントは、メイン VCL スレッド以外から同期的に開くことはできませんでした。

要するに、それは TDataSet 自体の制限ではなく、実装固有のものであり、あなたが言及したコンポーネントにはアクセスできません。

于 2008-09-17T00:10:23.793 に答える
3

複数のスレッド間で同じTDataSetを使用する場合に注意すべき点は、常に現在のレコードしか読み取れないことです。そのため、1 つのスレッドでレコードを読み取っていて、別のスレッドがNextを呼び出すと、問題が発生します。

于 2008-09-17T01:22:56.040 に答える
2

また、スレッドには独自のデータベース接続が必要になる可能性が高いことも覚えておいてください。ここで必要なのは、スレッドから(書き込み専用)にデータをロードし、メインVCLスレッドから読み取り専用にするマルチスレッドの「保持」オブジェクトであると思います。読む前に、ある種の同期方法を使用して、同じ瞬間に読んでいないこと、または同じ瞬間に読んでいないことを確認するか、すべてをメモリファイルにロードして同期方法を記述し、ファイル内のどこにメインアプリに通知するかを指定します読むのをやめなさい。

私は最後のアプローチを数回採用し、予想されるレコードの数(およびデータセットのサイズ)に応じて、これをローカルシステム上の物理ディスクファイルに移行しました。それは非常にうまく機能します。

于 2008-09-17T03:00:07.240 に答える
1

私はマルチスレッドデータアクセスを実行しましたが、それは簡単ではありません。

1)スレッドごとにセッションを作成する必要があります。

2)そのTDataSetインスタンスに対して行われるすべてのことは、それが作成されたスレッドのコンテキストで行われる必要があります。たとえばdbグリッドをその上に配置したい場合、これは簡単ではありません。

3)たとえばメインスレッドにデータを再生させたい場合、簡単な解決策は、それをある種の別のコンテナ、たとえばメモリデータセットに移動することです。

4)データの取得が完了したら、メインスレッドに通知するための何らかのシグナリングメカニズムが必要です。

...そして例外処理も簡単ではありません...

しかし:成功すると、アプリケーションは本当にエレガントになります!

于 2008-09-17T11:00:10.673 に答える
0

ほとんどの TDataset はスレッド セーフではありません。私が知っているスレッドセーフはkbmMemtableです。また、レコード ポインタの移動の問題 (Jim McKeeth による説明) が発生するように、データセットを複製する機能もあります。これらは、入手できる (購入または無料の) 最高のデータセットの 1 つです。

于 2008-09-20T03:28:14.627 に答える