2

私は C# で WinForms ウィンドウを作成しています。このウィンドウには、それぞれ数百から数千の項目を持つ約 12 個ListBoxと 6 個のコントロールが表示されます。ComboBox

これらを設定するには少し時間がかかります。長い時間ではありません - ほんの数秒ですが、プログラムがバックグラウンドで動作していることを待っている間、ユーザーが何かを見ることができると便利です。

これが発生している間、一般的な「お待ちください」アニメーションの境界線のない一番上のウィンドウが表示されますが、アニメーションに問題があります。

少し時間がかかるほとんどのタスクでは、次の方法でこれを解決します。

Program.ShowPleaseWait(); // Show top-most animation

Thread t = new Thread(stuffToDo); // Run stuffToDo() in separate thread
t.Start();

While (t.IsAlive)
  Application.DoEvents(); // Run message queue, necessary for animation

Program.HidePleaseWait(); // Hide top-most animation

そしてそれは非常にうまく機能します。ときどき、スレッド内のもので何かを呼び出す必要があり、アニメーションに小さな問題が発生することがありますが、通常は大した問題ではありません。

ただし、このフォームでは、スレッド内のコード全体が UI コードであり、ListBox と ComboBox を設定します。つまり、すべてを Invoke ブロックで囲む必要がありますが、そもそも別のスレッドで実行する意味がないため、意味がありません。

この特定のケースのワーカー スレッド全体を廃棄し、Application.DoEvents()各ループに 100 ごとに挿入する以外に、コントロールが設定されている間、動作中のアニメーションを続行できるようにするためにできることはありますか?

4

3 に答える 3

3

2 番目のスレッドでアニメーションを実行するだけです。複数の UI スレッドを持つことは許可されていますが、初期化したスレッド以外のスレッドから UI オブジェクトにアクセスすることは許可されていません。新しいスレッドは のインスタンスLoadingAnimationForm(またはアニメーション化されたダイアログと呼ぶもの) を受け入れて呼び出す必要がありApplication.Run(animForm); ますanimForm.Invoke(animForm.Close)animFormメインスレッドから他のメソッドを呼び出さないでください。

于 2011-10-17T04:30:48.917 に答える
1

考えられるアプローチの 1 つは、アイドル時間処理を使用して、コードの入力を実行することです。そこで、待機中のアニメーションを表示するために使用するダイアログ ボックス クラスを作成します。待機中のダイアログ ボックスを表示すると同時に、アイドル時間処理イベントにフックします。アイドル時間の処理が完全に完了したら、終了するようにダイアログにメッセージを送信します。

唯一の複雑な点は、アイドル時間イベントを整理して、すべてを一度に実行するのではなく、呼び出されるたびに少しの作業しか実行しないようにする必要があることです。すべてを一度に実行すると、ダイアログは更新された待機アニメーションを処理して表示する機会がありません。

于 2011-10-17T04:26:10.370 に答える
0

この投稿から取得:

この CodeProjectリンクを追加してもよろしいですか?

ビルドして、ツールバーからドラッグして使用するだけです。コンポーネントはLoadingCircleまったく問題なく動作します。魔法のように機能し、カスタマイズすることもできます!

于 2013-03-13T18:03:46.747 に答える