0

メインフォームが読み込まれる前に読み込まれるスプラッシュ画面があります。メイン画面が読み込まれる前にスプラッシュ画面が閉じます。ここに投稿したスレッドのライセンスキーに基づいてアプリケーションの読み込みに時間がかかるため、スプラッシュ画面を追加しました。

検索しましたが、コードに実装する方法がわかりませんでした。私もBackgroundworkerに出くわしましたが、どうすればよいかわかりません。

メインコード:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Thread th = new Thread(new ThreadStart(ShowSplashScreen));
    th.Start();
    Thread.Sleep(5000);
    Application.Run(new frmMain());
    th.Abort();
}

static void ShowSplashScreen()
{
    Application.Run(new frmSplashScreen());
}

スプラッシュ画面:

フォームロードで

timer1.Start();
timer1.Interval = 600;
progressBar1.Maximum = 10;

private void timer1_Tick(object sender, EventArgs e)
{
    if (progressBar1.Value != 10)
    {
        progressBar1.Value++;
    }
    else
    {
        timer1.Stop();
        timer1.Enabled = false;
        this.Close();
    }
}
4

1 に答える 1

1

スプラッシュ画面用に別のスレッドを開始するためのすべての努力を経て、正しいアイデアを持っていることを意味します。問題は、実装が少しずれていることです。の呼び出しは実際に現在のThread.Sleepスレッドをスリープ状態にするため、メインUIスレッドは約5秒間完全に停止し、スプラッシュ画面が表示されているときにメインフォームをバックグラウンドでロードする場合は何もしません。戻った後、メインフォームを起動するように呼び出しますが、その時点では遅すぎます。コードで指示されて閉じている限り、スプラッシュ画面はすでに表示されたままです。Thread.SleepApplication.Run

呼び出しをThread.Sleepスプラッシュ画面スレッドに移動することで問題を解決できる可能性がありますが、正直なところ、これはかなり醜くハック的なアプローチです。スレッドのスリープに固有の問題は別として、スプラッシュスクリーンの本当のポイントは(あなた自身が認めているように)、ユーザーが長いタスクを完了している間、視覚的に興味深く、安心して見ることができるようにすることです。ほとんどのユーザーはスプラッシュスクリーンを特に好きではありませんが(実際、ほとんどの人はスプラッシュスクリーンを嫌っているようです)、限られた目的ではありますが、間違いなく目的があります。あなたがのようなものを使うときThread.Sleep、効果的にスプラッシュ画面を画面上に強制的に移動させて何もせずに、CPUサイクルを回転させ、理由もなくユーザーの時間を無駄にしているだけです。彼らはそれをはるかに寛容にしないでしょう。それはおそらくあなたの計画ではないと確信していますが、それが最終的に起こることであることがよくあります。

長時間の検証をバックグラウンドで同時に実行しているときに、実際にスプラッシュ画面を表示できたら素晴らしいと思いませんか?確かに、これはスプラッシュスクリーンの「正しい」実装ですが、正しく機能させるのは非常に困難です。UIコードの同期とクロススレッドは、作成するのが難しく、デバッグするのがさらに難しいです。

代わりに、パントすることをお勧めします。コードを取り除いて、スプラッシュ画面とそのすべてのThread.Sleep醜さを手動で表示し、代わりに組み込みのスプラッシュ画面フレームワークに置き換えます。巧妙なMicrosoftプログラマーMicrosoft.VisualBasicが、C#の人々が見つけられない名前空間の下に隠していたため、ほとんどの人はそれについて知りません。しかし、それであなたを騙してはいけません。これはC#アプリケーションと完全に連携し、作業を大幅に楽にします。なぜそれらのVB.NETの人たちは、自分たちのためにすべての良いものを蓄えなければならないのですか?

このフレームワークはすべてを自動的に処理します。必要なのは、スプラッシュ画面フォームクラス(すでに持っているように見える、という名前frmSplashScreen)を提供することだけです。サンプルコードを含む、ここでの私の回答でそれを使用するための完全な手順を見つけることができます。

于 2013-03-16T07:33:33.083 に答える