2009-06-01 41 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方法来实现更简洁的启动画面实现。