5

データベースをスキャンするために非常に長い時間実行できるアプリケーションがあります。
このプロセスの間、processmessage を使用してプログラムの応答性を維持します。
このプロセス メッセージは、進行状況バーが更新されて増加したときにトリガーされます。
ほとんどの場合、これで問題なく動作しますが、データベースが大きくなると、プログレス バーが 1% 上昇するのに時間がかかり、それまでプログラムが応答しなくなります。

プロセスメッセージ以外にプログラムを存続させる別の方法はありますか?

4

2 に答える 2

8

マルチスレッドが答えです。標準的な Delphi アプリケーションは、基本的に、一度に 1 つのことを実行できるシングル スレッド アプリケーションです。したがって、GUI ロックアップは、何か他のことをしている場合、応答性を維持できません。

レスポンシブ GUI が必要であると同時に重い作業を行う場合は、別のスレッドで重い作業を行う必要があります。このようにして、メイン スレッドは応答性の高いプログラムを実現し、ワーカー スレッドは面倒な作業を行うことができます。これは、重いデータベースの作業に適していますが、たとえばファイルのダウンロードや、たとえばリモート サーバーの応答に時間がかかる状況にも適しています。

しかし、マルチスレッドの使用方法を説明すると、この質問の説明が大きすぎるため、この回答はおそらく回答よりも多くの質問を提供します。

ただし、もう 1 つ: データベース コードを詳しく調べてください。データベースからレコードをどのように取得していますか、データベースに適切なインデックスがあるかなどなど。マルチスレッドについて考え始める前に、このコードを最適化することで非常に高速な速度を得ることができます。

http://cc.embarcadero.com/item/14809から写真付きでダウンロードできる次のリソースを見つけました: http://thaddy.co.uk/threads/非常に役立つスレッド化チュートリアルです。

于 2013-01-08T13:08:11.917 に答える
4

GUIプログラムを応答性のあるものに見せたい場合は、メッセージキューをタイムリーに処理する必要があります。代替手段はありません。

データベースクエリの実行に関しては、UIをフリーズせずに実行する方法は、クエリを別のスレッドに移動することです。

于 2013-01-08T12:46:51.750 に答える