0

こんにちは

独自のデータセットを使用してデータベースにアクセスするコントロールがあります。データベースは古い ISAM ベースのデータベースです。

コントロールは、バックグラウンド スレッドを使用して、独自のデータセットを使用してデータベースにクエリを実行します。

フォームにはこれらのコントロールがいくつかあり、それぞれが独自のスレッドを使用してデータにアクセスします。それらはすべて同時にロードする必要があるためです。

独自のデータセットは、開いているテーブルが別のユーザーによってロックされており、データセットがロックの解放を待っていることをユーザーに通知する VCL TForm を表示することで、同時実行を処理します。

フォームには、ユーザーがロック待機をキャンセルできるキャンセル ボタンがあります。

問題:

スレッド内から独自のデータセットを使用する場合、ロック待機フォームが表示された場合、アプリケーションがクラッシュ、ハング、または何らかのエラーが発生します。これは、VCL がスレッドセーフではないことに関係していると思われます。

Dataset.Open を同期することで問題を解決しましたが、dataset.open が返されるまでメイン スレッドが保持され、クエリの複雑さによってはかなりの時間がかかる場合があります。

何かが起こっていることをユーザーに知らせるモーダルプログレスバーを表示しましたが、ユーザーはプログレスバーが完了するのを待っているので、このアイデアは好きではありません。

独自のデータセット コードは、メイン アプリケーションにコンパイルされます。つまり、別の DLL には保存されません。リリースに近すぎるため、開発プロセスのこの段階では、ロックの仕組みやフォームを表示するかどうかを変更することはできません。

理想的には、メイン スレッドを使用する代わりに、コントロール スレッドでも Dataset.open を実行したいと考えていますが、これはうまくいかないようです。

他の誰かが回避策を提案できますか? お願いします。

4

2 に答える 2

1

ファイバーは、協力的なマルチタスクを念頭に置いて書かれた古いコードの移植を容易にするためだけに Windows API に含まれているため、少しも役に立ちません。ファイバーは基本的にコルーチンの形式であり、すべて同じプロセスで実行され、独自のスタック スペースを持ち、それらの間の切り替えは OS ではなくユーザー コードによって制御されます。つまり、それらの間の切り替えは安全な時間にのみ行われるため、同期の問題は発生しません。OTOH は、1 つのスレッド内で同時に実行できるファイバーは 1 つだけであることを意味するため、ブロッキング コードでファイバーを使用することは、1 つのスレッド内からブロッキング コードを呼び出すことと同じ特性を持ち、アプリケーションが応答しなくなります。

ファイバーを複数のスレッドと一緒に使用することもできますが、これは危険である可能性があり、スレッドを単独で使用するよりもメリットがありません。

私は VCL アプリケーション内でファイバーを使用して成功しましたが、それは特定の目的のためだけでした。ブロックする可能性のあるコードに対処したい場合は、それらを忘れてください。

問題については、表示目的のみに使用され、標準のプロセス間通信メカニズムを使用して、データベースにアクセスする別のプロセスとデータを交換するコントロールを作成する必要があります。

于 2011-03-20T08:46:15.760 に答える
0

COM オブジェクトは、アウトプロセス モードで実行できます。Delphi の場合は、それらを使用する方が少し簡単で、別の IPC メカニズムを使用する方が簡単です。

于 2011-03-20T09:27:30.667 に答える