質問

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

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

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

役に立ちましたか?

解決

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

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

他のヒント

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

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

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

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

また、スレッドには独自のデータベース接続が必要になる可能性が高いことにも注意してください。ここで必要なのは、スレッドからデータをロードし(書き込み専用)、その後メイン VCL スレッドから読み取り専用となるマルチスレッドの「保持」オブジェクトだと思います。読み取る前に、ある種の同期メソッドを使用して、書き込みと同時に読み取ったり、読み取りと同じ瞬間に書き込んだりしないようにするか、すべてをメモリ ファイルにロードして、ファイル内のどこにデータを書き込むかをメイン アプリに伝える同期メソッドを作成します。読むのをやめてください。

私は、予想されるレコード数 (およびデータセットのサイズ) に応じて、最後のアプローチを数回採用し、これをローカル システム上の物理ディスク ファイルに保存することもありました。かなりうまくいきます。

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

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

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

3) たとえば、メインスレッドがデータを操作する場合、直接的な解決策は、データを何らかの別のコンテナに移動することです。メモリ データセット。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top