3

これは、すべての開発者が時々直面する非常に一般的な問題であり、視覚的な更新が非常に高速で、フォームの内容がちらつくことがあります。現在、スレッドを使用してファイルを検索し、その呼び出し元 (メイン VCL) スレッドにイベントをトリガーして、すべての検索結果を報告しています。FindFirst/を使用したことがある場合FindNext、または非常に高速で高速な反復を実行する大規模なループを実行したことがある場合は、小さな反復ごとに GUI を更新することは非常に重く、スレッドの目的をほとんど無効にすることを知っているでしょう。スレッドは、GUI がどれだけ速く更新できるかに依存するようになるためです (スレッド内のすべての反復で)。

スレッドからのすべてのイベント (1 ミリ秒で 100 個のイベントが発生する可能性があります) に対して私が行っていることは、単純にグローバル整数をインクリメントして反復回数をカウントすることです。次に、その番号をメイン フォームのラベルに表示しています。ご想像のとおり、スレッドからの急速な更新により、これは制御できないほどちらつきます。

だから私が知りたいのは、スレッドが更新できるよりも速くイベントをフィードしているときに、GUI でこの急速なちらつきを回避する方法です。

注: VCL スタイルを使用しているため、ちらつきがさらに悪化します。

4

1 に答える 1

4

これは確かに、常にスレッドではなく、GUI を更新する必要があるループによって発生する一般的な問題であり、同時に、GUI が更新できるよりも速くループが繰り返されます。これに対する迅速かつ簡単な解決策は、Timer を使用して GUI を更新することです。ループが更新をトリガーするたびに、すぐに GUI を更新しないでください。代わりに、更新が必要な可能性があるもの (カウントを表示するラベル) ごとにグローバル変数 (グローバル反復カウントなど) を設定し、タイマーに GUI の更新を行わせます。タイマーの間隔を 100 ~ 200 ミリ秒に設定します。このようにして、設定したタイマー間隔と同じ頻度でのみ GUI の更新が発生するように制御します。

これのもう 1 つの利点は、スレッドのパフォーマンスが GUI の更新速度に依存しなくなることです。スレッドはそのイベントをトリガーし、この整数のみをインクリメントして、作業を続行できます。GUI をスレッド保護していることを確認する必要があることに注意してください。これは独自の技術であり、ここでは説明しませんが、既にご存知だと思います。

注: 実行する必要がある GUI の更新が多いほど、タイマーの間隔を微調整する必要がある場合があります。

于 2013-01-29T00:59:05.593 に答える