2009-06-01 86 views
0

我使用的是從Here啓動的畫面。我愛它是多麼簡單。但是它的問題在於,點擊它之前,啓動畫面不會消失。在IDE中運行時,它工作正常。有任何想法嗎?我會在這裏附上代碼,但由於某種原因沒有正確插入代碼。啓動畫面不會消失

private System.Windows.Forms.Timer timer1; 
//private Splash sp=null; 

public Form1() 
{ 
    InitializeComponent(); 

    Thread th = new Thread(new ThreadStart(DoSplash)); 
    //th.ApartmentState = ApartmentState.STA; 
    //th.IsBackground=true; 
    th.Start(); 
    Thread.Sleep(3000); 
    th.Abort(); 
    Thread.Sleep(1000); 
} 

private void DoSplash() 
{ 
    Splash sp = new Splash(); 
    sp.ShowDialog(); 
} 

private void timer1_Tick(object sender, System.EventArgs e) 
{ 
//  sp.Close(); 
} 
+0

...感謝您添加代碼。不知道爲什麼我在格式正確的時候遇到了很多麻煩。 – JimDel 2009-06-01 22:57:29

回答

6

首先,使用Thread.Abort完成該頁面上的啓動畫面的方式,是而不是正確的做事方式。

,一定不要調用Thread.Abort,除非你在關閉AppDomain線程生命的過程是。

讓我再次重申強調。 您應該撥打Thread.Abort的唯一時間是當您對Thread.Abort足夠了解時,以及如何知道您永遠不應該調用它。

看看StackOverflow上的其他問題:Multi-Threaded splash screen in c#?


如果你想保持現有的解決方案,可能更好的方式是到計時器拖放到閃屏的形式,它的定時器設置爲你想要的啓動畫面在屏幕上停留的時間,通話Close在其Tick事件處理程序中。

在同一地點,我只是簡單地燒掉原來的線程,並刪除其他線。

換句話說,從頁面上的第一個代碼塊,我會保持這兩條線:

Thread th = new Thread(new ThreadStart(DoSplash)); 
th.Start(); 

夫婦,與使表單自閉的窗體上的定時器,和你」比試圖去處理Thread.Abort更好的形狀。

你不應該打電話。

2

的DoSplash或許應該叫sp.Show()代替sp.ShowDialog()

但調用sleep(X000)形成你的主線程來顯示啓動畫面是不是很有效,而且Thread.Abort的()應保留以便更好地使用。

更好的方法是用Timer關閉SplashForm並設置最小延遲。在啓動時,您可以顯示()和更新()SplahForm並繼續加載內容。在MainForm完成初始化並進入EventLoop之前,定時器事件不會觸發。不需要線程,MainForm也不一定涉及。

只給你一個消息循環驅動SplashForm的主要成份:

public partial class SplashForm : Form 
{ 
    // default stuff 

    public static void Splash() 
    { 
     var s = new SplashForm(); 
     s.Show(); 
     s.Update();// force paint 
    } 

    private void SplashForm_Load(object sender, EventArgs e) 
    { 
     Timer t = new Timer(); 
     t.Interval = 1; // wait for EventLoop 
     t.Tick += GoAway; 
     t.Enabled = true; 
    } 

    private void GoAway(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 

,然後在Program.cs中,

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
SplashForm.Splash(); 
Application.Run(new MainForm()); 
+0

不,這隻會給他另一個問題,即啓動屏幕不會留在屏幕上。 ShowDialog在窗體關閉之前不會返回,但.Show會執行,因此線程會突然結束,因爲沒有消息循環運行。 – 2009-06-01 22:32:53

+0

@Lasse,你可能是對的,我停止閱讀鏈接的樣本很快。不錯的圖片。 – 2009-06-01 22:37:05

+0

是的,我也很喜歡。殷和...錯誤... Windows。 (第二個想法,看起來他刪除了Yin,所以這是Yang和Windows。 – 2009-06-01 22:41:07

1

這是一個醜陋的實現。你應該檢查出this SO thread。它描述瞭如何使用C#中的VisualBasic.NET命名空間和OnCreateSplashScreen方法來實現更簡潔的啓動畫面實現。