R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

スプラッシュスクリーン

そういえば、皆さんにいろいろなご意見をいただきながら修正した

スプラッシュ

スクリーンを結局どうしたのかについて、続きを書いていませんでした。
結局 BackgroundWorker を使って、以下のようにしました。
スプラッシュスクリーンフォームに、BackgroundWorker コントロールを追加し、以下のメソッドを参照して、適切なイベントを登録してあります。


public partial class SplashForm : Form
{
  MainWindow mainWindow; // メインウィンドウです。

  // スプラッシュスクリーンが開ききったら BackGroundWorker を実行。
  private void SplashForm_Shown(object sender, EventArgs e) {
    this.backgroundWorker.RunWorkerAsync();
  }

  // BackGroundWorker による別スレッドの実行内容。
  private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
    this.mainWindow = new MainWindow();
    this.mainWindow.FormClosed += new FormClosedEventHandler(mainWindow_FormClosed);
  }

  // 別スレッドによる重たい処理が終わった後の処理
  private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    this.mainWindow.Show();
    this.Hide();
  }

  // メインウィンドウが閉じられたら、スプラッシュスクリーンも閉じる。
  private void mainWindow_FormClosed(object sender, FormClosedEventArgs e) {
    this.mainWindow.Dispose();
    this.Close();
  }
}


Shown にした理由としては、とにかくスプラッシュスクリーンの表示を最優先にしたかったからです。
スプラッシュスクリーンが開いた後は、別スレッドで重たい(筈の)メインウィンドウを生成します。
アプリケーションを実行するためには、以下のようにスプラッシュウィンドウを開きます。


public static class Program
  static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new SplashForm());
  }
}


本当は、ここでメインフォームを開くのが僕としては理想的ではあるのですが、まあスプラッシュスクリーンがアプリケーションのスターターだと思うことで無理やり納得します orz

投稿日時 : 2007年3月28日 11:05

Feedback

# re: スプラッシュスクリーン 2007/03/28 11:12 渋木宏明(ひどり)

この仕組みを取り入れたアプリを相手に、Process.MainWindowXXX を参照すると、通常期待するのとは異なる結果が待っているわけですね。

# re: スプラッシュスクリーン 2007/03/28 11:31 とっちゃん

ついでにいうと、プライマリスレッドがゴーストスレッド化してるww
プライマリスレッドがメインスレッドではない場合、外部とのやり取りで意図しない挙動をしめすことがありますね。
Windowsのタスク管理はメインスレッド=プライマリスレッドという前提条件で作られてるので、いろんな所でいたいことになります...w

# re: スプラッシュスクリーン 2007/03/28 11:47 R・田中一郎

渋木宏明(ひどり) さん

>この仕組みを取り入れたアプリを相手に、Process.MainWindowXXX を参照すると、通常

あれ?
これって今作っているものに既に実装しているんですけど、何かまずいんでしょうか?

----------------------------------------------
とっちゃん

>ついでにいうと、プライマリスレッドがゴーストスレッド化してるww

ついでに、ということは、少なくとも問題が2つあるということですね。
どこだろう・・・

# re: スプラッシュスクリーン 2007/03/28 12:00 R・田中一郎

あ、何となくわかってきた・・・
メインウィンドウを別スレッドで生成しているのがいけないんですね。

# re: スプラッシュスクリーン 2007/03/28 16:41 R・田中一郎

あれ?
違うのかなー

# re: スプラッシュスクリーン 2007/03/28 18:20 Hirotow

それプラスメインウィンドウがメインウィンドウじゃないこと、だと思います。
ApplicationContextで、非同期でスプラッシュしつつメインスレッドでメインウィンドウ表示とかのほうがいいかもしれません。
んでもってShownでスプラッシュクローズ+非同期処理終了します。

# re: スプラッシュスクリーン 2007/03/29 9:35 R・田中一郎

Hirotow さん

>それプラスメインウィンドウがメインウィンドウじゃないこと、だと思います。

なるほど、ありがとうございます。
後日修正したものをアップしようと思います。

# スプラッシュウインドウ 2007/04/15 13:53 オノデラの研究日記 in わんくま

スプラッシュウインドウ

タイトル
名前
Url
コメント