アプリの起動時に 1 ~ 2 秒かかる db4o データベースからいくつかのデータをロードする必要がありました。最初にすべてのデータをロードする必要があるため、残りは待機する必要があります。独自のスレッドでこれを行うと、残りはスレッドの終了を待つ必要があります。独自のスレッドが必要なもののために、データがロードされている間にスプラッシュ画面などを実行したいですよね? どうしますか?
csharp、.net 3.5、および winforms を使用しています
アプリの起動時に 1 ~ 2 秒かかる db4o データベースからいくつかのデータをロードする必要がありました。最初にすべてのデータをロードする必要があるため、残りは待機する必要があります。独自のスレッドでこれを行うと、残りはスレッドの終了を待つ必要があります。独自のスレッドが必要なもののために、データがロードされている間にスプラッシュ画面などを実行したいですよね? どうしますか?
csharp、.net 3.5、および winforms を使用しています
起動時にスプラッシュ画面を表示するのは簡単です。アプリケーションの Main() メソッド (Program.cs 内) で、Application.Run(...) 行の前に次のように記述します。
SplashForm splashy = new SplashForm();
splashy.Show();
Application.Run(new MainForm(splashy));
メイン フォームのコードとコンストラクタを次のように変更します。
private SplashForm _splashy;
public MainForm(SplashForm splashy)
{
_splashy = splashy;
InitializeComponent();
}
次に、MainForm の Load イベント (おそらくデータベース コードが含まれている) の最後に、次のコードを追加します。
_splashy.Close();
_splashy.Dispose();
別の Thread または BackgroundWorker を使用してデータベース アクセスを行うことを選択した場合、BackgroundWorker が処理を行っている間に表示される何らかの進行状況インジケーター フォームが必要になるため、実際にはスプラッシュ スクリーンは必要ありません。それは、ここでの私の答えとは異なる方法で行われます。
1つの方法ですが、おそらくより良い方法です。進行状況ウィンドウ/スプラッシュ スクリーンとなる新しいダイアログ フォームを作成します。ビットマップなどを唯一のアイテムとして投げます。メイン プログラムからダイアログをインスタンス化します。プログレス フォームの Load イベントをオーバーライドし、そこから、データをロードするためのバックグラウンド処理作業を行う新しいスレッドを起動します。このようにして、メイン アプリから ShowDialog を呼び出すことができます。
System.ComponentModel.BackgroundWorker を使用すると、スレッドが完了したときのイベントを簡単に関連付けて、そのイベントからダイアログを自動的に終了できます。コントロールが呼び出し元のアプリケーションに返され、完了です。
以前にアプリケーションでこの種のことを行ったことがあり、正常に動作しますが、初心者のアプローチだと確信しています。バックグラウンド スレッドを起動する形式の Load イベントのサンプル コードを次に示します (私の場合は、大きなファイルを開いて解析しています)。
private void FileThreadStatusDialog_Load(object sender, EventArgs e)
{
Cursor = Cursors.WaitCursor;
if (m_OpenMode)
{
this.Text = "Opening...";
StatusText.Text = m_FileName;
FileThread = new BackgroundWorker();
FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
FileThread.DoWork += new DoWorkEventHandler(FileOpenThread_DoWork);
FileThread.WorkerSupportsCancellation = false;
FileThread.RunWorkerAsync();
}
else
{
this.Text = "Saving...";
StatusText.Text = m_FileName;
FileThread = new BackgroundWorker();
FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
FileThread.DoWork += new DoWorkEventHandler(FileSaveThread_DoWork);
FileThread.WorkerSupportsCancellation = false;
FileThread.RunWorkerAsync();
}
}
そして、フォームが存在する作業完了メソッドは次のようになります。
private void FileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
FileThread = null;
DialogResult = DialogResult.OK;
Close();
}
メインダイアログから進行状況ダイアログを開く方法は次のとおりです。
FileThreadStatusDialog thread = new FileThreadStatusDialog(m_Engine, dlg.FileName, true);
if (thread.ShowDialog(this) == DialogResult.OK)
{
m_Engine = thread.Engine;
FillTree();
}
追加することにより、MusiGenesis の回答でスプラッシュの描画を強制したい場合があります。
Application.DoEvents();
直後
splashy.Show();