私は、ユーザーがさまざまなシステムで実行できる一連のクエリを選択できるアプリケーション(Delphi 2009を使用)を作成しました。クエリを同時に実行できるようにするために、各クエリはTADOQueryオブジェクトを使用して独自のスレッドで実行されます。これはすべて正常に動作します。マルチスレッド(TThread)Delphiアプリケーションが終了しない
問題は、クエリが実行されている(したがって、別のスレッドがアクティブである)ときにアプリケーションを閉じるときです。私は各スレッドを作成するときに、スレッドのTHandleを配列に記録します。アプリケーションを終了しようとすると、スレッドがまだ実行中であれば、スレッドのハンドルを取得し、TerminateThreadに渡します。これは理論的にはスレッドを終了し、アプリケーションを閉じることができます。しかし、これは起こりません。メインフォームのonCloseイベントがトリガされ、アプリケーションが終了しているように見えますが、プロセスはアクティブのままで、アプリケーションがまだ実行中であるかのように表示されます(つまり、「実行」ボタンがグレー表示され、デバッグビューがアクティブなど)。手動でプロセスを終了するまで(DelphiのCtrl-F2またはタスクマネージャを使用して)、コントロールをDelphiに戻すことはできません。
私はTerminateThreadを使用していますが、クエリが実行に長時間かかることがあります(エンドユーザー環境で完璧に可能な100万レコードを扱う場合は数分です)。私が間違っていない限り、スレッドはTerminatedプロパティをチェックすることができないので、クエリが返されるまでTrueに設定されていれば終了することができないため、スレッドを終了できません通常の方法で(つまり、Terminatedプロパティをチェックすることによって)大量のクエリが実行されている間にユーザーがアプリケーションを終了したい場合があります。その場合、すべてのクエリが完了するまで待つのではなく、すぐに終了する(つまり、実行中のすべてのスレッドがただちに終了する)必要があります。 TerminateThreadは理想的ですが、実際にスレッドを終了させているわけではありません!
誰でも助けてもらえますか?誰もTerminateThreadが正しく動作しない理由を知っていますか?誰もすぐに大規模なADOクエリを実行しているスレッドを取得するために何かを提案することはできますか?
ありがとうございました!
これは前進のようです。私は過去1週間ほど何か他のことに取り組んできましたが、今後数日でこれを調べます。これのためのソースの例がありますか? – Jeedee