こんにちは
独自のデータセットを使用してデータベースにアクセスするコントロールがあります。データベースは古い ISAM ベースのデータベースです。
コントロールは、バックグラウンド スレッドを使用して、独自のデータセットを使用してデータベースにクエリを実行します。
フォームにはこれらのコントロールがいくつかあり、それぞれが独自のスレッドを使用してデータにアクセスします。それらはすべて同時にロードする必要があるためです。
独自のデータセットは、開いているテーブルが別のユーザーによってロックされており、データセットがロックの解放を待っていることをユーザーに通知する VCL TForm を表示することで、同時実行を処理します。
フォームには、ユーザーがロック待機をキャンセルできるキャンセル ボタンがあります。
問題:
スレッド内から独自のデータセットを使用する場合、ロック待機フォームが表示された場合、アプリケーションがクラッシュ、ハング、または何らかのエラーが発生します。これは、VCL がスレッドセーフではないことに関係していると思われます。
Dataset.Open を同期することで問題を解決しましたが、dataset.open が返されるまでメイン スレッドが保持され、クエリの複雑さによってはかなりの時間がかかる場合があります。
何かが起こっていることをユーザーに知らせるモーダルプログレスバーを表示しましたが、ユーザーはプログレスバーが完了するのを待っているので、このアイデアは好きではありません。
独自のデータセット コードは、メイン アプリケーションにコンパイルされます。つまり、別の DLL には保存されません。リリースに近すぎるため、開発プロセスのこの段階では、ロックの仕組みやフォームを表示するかどうかを変更することはできません。
理想的には、メイン スレッドを使用する代わりに、コントロール スレッドでも Dataset.open を実行したいと考えていますが、これはうまくいかないようです。
他の誰かが回避策を提案できますか? お願いします。