1

メモリにロードする必要のある大きなクエリがあります。このクエリを開くには約30秒かかります。アプリケーションの起動直後に1回だけロードされます。この間、アプリケーションはハングします。私がする必要があるのは、30秒間にプログレスバーを更新することです。プログレスバーを更新するために新しいスレッドを作成しようとしましたが、クエリが開かれた後にのみ更新されます。誰かがこれを行う簡単な方法を指摘できますか?

スレッドクラスを作成しました:

type
   TMyThread = class(TThread)
   private
      fLowerLimit: Integer;
      fUpperLimit: Integer;

スレッドクラスのインスタンスを作成しています:

   CountingThread := TMyThread.Create(0, 300, True);
   CountingThread.Resume;
   //
   SplashDlg.Show;

スレッド内では、プログレスバーを更新しています。

procedure TMyThread.UpdateMainThread;
begin
   SplashDlg.ProgressBar1.Position:= SplashDlg.ProgressBar1.Position+1;
   MyDebug('UpdateMainThread:'+ IntToStr(SplashDlg.ProgressBar1.Position));
end;

クエリを開いている間、スレッドがハングします。

4

2 に答える 2

2

より正確な答えを得たい場合は、ここにコードを貼り付けることをお勧めします。

魔女には、データを処理してUIをレスポンシブにする2つの方法があります。

  • ループでApplication.ProcessMessagesを使用できます。

  • または、すでにアプローチしたスレッドソリューション。

問題は、コンポーネントを使用しているループがないと思います。そのコンポーネントが進行状況を表示するメソッドを呼び出さない場合、クエリが完了するまでにかかる時間を見積もることができません。したがって、プログレスバーなしでクエリが実行されているときにロード中の画面を表示するか、クエリに使用するものについて詳しく教えてください。

それが役に立てば幸い

于 2012-12-17T12:42:13.137 に答える
1

あなたはそれを逆にやっています。

UIはアプリケーションのメインスレッドにバインドされているため、常にメインスレッドでUIを処理し、ワーカースレッド(そこからワーカー名)で実際のジョブを実行します。

あなたが質問している方法では、あなたはすでにスレッドを扱っているので、視点を変えて、UIの応答性を維持し、現在はビジーでない状態で更新しながら、セカンダリスレッドで大量のSQLロードを実行するだけです。メインスレッド。

30秒の待機時間については、実際には、ロード時間を正確に判断できない場合は、プログレスバーを使用しない方がよいでしょう。なぜなら、私たちは皆、物事の実際の状態を反映しない嘘つきのバーを嫌うからです。バーが50%を表示し、突然100%になる場合があります...または100%に達する場合がありますが、実際には完了するまでに時間がかかります(サーバーの負荷が高い、ネットワークの速度が遅い、その他1,000の要因) 。

今日、私たちは皆、次のような単なる待機インジケーターに慣れています。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これを見ると、それが機能していることがわかり、完了するまで待つ必要があります。

于 2012-12-18T16:37:53.727 に答える