2016-11-10 42 views
1

私は時間のかかるコードを持つスプラッシュ画面を持っており、メインスレッドで実行したくありません。私はスレッドを停止し、フォームを閉じるべきであるコードを作ったが、うまくいきません。どんな助けも歓迎されます。スプラッシュ画面のスレッド

コード:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 

namespace Cobalt 
{ 
    partial class Cobalt : Form 
    { 
     public static bool splashCont { get; set; } 

     public Cobalt() 
     { 
      this.Text = "Cobalt V1.0.0"; 
      this.Width = 400; 
      this.Height = 100; 
      this.BackgroundImage = Properties.Resources.cobaltlgo; 
      this.FormBorderStyle = FormBorderStyle.None; 
      this.TopMost = true; 
      this.StartPosition = FormStartPosition.CenterScreen; 

      Thread splash = new Thread(new ThreadStart(splashLoadAction)); 
      splash.Start(); 

      if (splashCont) 
      { 
       splash.Abort(); 

       this.Close(); 
      } 
     } 

     private void splashLoadAction() 
     { 
      Thread.Sleep(5000); 
      Cobalt.splashCont = true; 
     } 
    } 
} 

プログラムは、ちょうどこの画面のまま: Screen EDIT:

Invoke((MethodInvoker)delegate { MyNextForm.Show(); }); 

呼び出す:私は次のコードを使用してこの問題を解決することができました UIスレッドのMyNextForm.Show()

+0

「機能しません」とはどういう意味ですか? – Enigmativity

+1

また、 'Thread.Abort()'を呼び出すと、アプリ全体を強制的に閉じようとしているのでなければ、**間違った**をやっています。 – Enigmativity

答えて

-1

あなたがスレッドでのThread.sleepを持っているように、メインスレッドは、あなたが本当のsplashCnt =を設定することができる前にコード

if (splashCont) 
{ 
    splash.Abort(); 

    this.Close(); 
} 

がうまく実行されますので、実行を継続します。

本当にスレッドをスリープ状態にする必要があるかどうかを確認し、必要に応じて回避策を検討する必要があります。

あなたは本当にスレッドはあなたがスプラッシュスクリーンの形で行われている作業をしたい場合は、あなたがこれを簡素化することができ

while (splash.IsAlive) 
{ 
    Thread.Sleep(1000); 
} 

if (splashCont) 
{ 
    splash.Abort(); 
    this.Close(); 
} 
+0

しかし、メインスレッドが停止し、GUIが表示されない – steve

+0

平均スレッドにThread.Sleepを入れたくない場合は、スレッドから呼び出されているメソッドからThread.Sleepを取得する必要がありますまた、 – Mallappa

0

を完了するために、サブスレッドのメインスレッドの待機を作ることができるよりも、スリープ状態にしたい場合大きく。これは、あなたの5秒間の睡眠が開始作業をシミュレートしていることを前提としています。このようにして、スタートアップ作業が完了するとスプラッシュフォームが閉じます。

partial class Cobalt : Form 
{ 
    public Cobalt() 
    { 
     this.Text = "Cobalt V1.0.0"; 
     this.Width = 400; 
     this.Height = 100; 
     this.BackgroundImage = Properties.Resources.cobaltlgo; 
     this.FormBorderStyle = FormBorderStyle.None; 
     this.TopMost = true; 
     this.StartPosition = FormStartPosition.CenterScreen; 
     this.Show(); 
     splashLoadAction(); 
     this.Close(); 
    } 

    private void splashLoadAction() 
    { 
     Thread.Sleep(5000); 
    } 
} 
0

タイマーをスプラッシュ画面に配置し、時間が経過すると閉じます。メインアプリケーションフォームを開始する前に、このフォームが表示されるように、アプリケーションのエントリポイントを変更することをお勧めします。

実際のアプリケーションでは、アプリケーションの準備ができていない場合やメインフォームが実際に表示されるまでスプラッシュを長く表示したい場合は、これよりも複雑な場合があります。

スプラッシュが閉じられてからアプリケーションが表示されるまでの間に数秒間表示されないウィンドウがないため、アプリケーションがクラッシュしたとユーザーに考えさせる可能性があるため、 ..

タイマー、アイドルイベント、ビジビリティイベントを使用すると、すべての動作の仕組みを理解すれば、まったく同じことができます。

+0

良いアイデア。私はそれらを考慮する – steve

関連する問題