开机启动logo心得体会

mznxbc123456 2014-04-21 01:55:11
最近在忙着给项目添加一个开机logo,原因是进入软件界面的时候需要遍历硬件地址32次,大概需要5秒钟的时间,觉得太长了。所以打算添加一个开机logo,logo显示5秒,之后logo消失正好可以显示应用界面。
这么一个简单的功能我当然没放在眼里,在项目program.cs文件中实现。logo画面很好实现,根据.net的机制,我要操作画面上的控件,必须得新建一个线程让画面显示出来,
Thread thUI = new Thread(new ThreadStart(ShowSplashWindow));
thUI.Name = "SplashUI";
//thUI.Priority = ThreadPriority.Normal;
thUI.IsBackground = true;
thUI.Start();private static void ShowSplashWindow()
{
SplashForm = new LoadPic();
Application.Run(SplashForm);
}

画面显示出来之后才能对画面操作。操作也是一个线程。
Thread thUiL = new Thread(new ThreadStart(LoadResources));
thUiL.Name = "Resource Loader";
//thUiL.Priority = ThreadPriority.AboveNormal;
thUiL.IsBackground = true;
thUiL.Start();
thUiL.Join();private static void LoadResources()
{
for (int i = 1; i <= 30; i++)
{
if (SplashForm != null)
{
SplashForm.Invoke(new MethodInvoker(delegate { SplashForm.lblStatus.Text = "Loading some things... "; }));
}
Thread.Sleep(100);
}
SplashForm.Invoke(new MethodInvoker(delegate { SplashForm.lblStatus.Text = "Done. "; }));
}

这意味着我要操作我主画面的控件,也要新建一个线程去显示我的主画面,还要有一个线程去操作这个主画面的控件。用线程去创建主画面肯定是不行的。所以这个方法貌似行不通,而且这样就会开辟4个线程。这样一个简单的功能花费了我很多时间,我现在也不知道该怎么去实现了。
Application.Run(new Form1()); 
一旦进入主画面代码就切不到program里面了,试想着把logo在主画面关闭,但program中定义都要是static,
public static LoadPic SplashForm
{
get;
set;
}

我无法将这个logo画面在program以外的代码区关闭,实在很闹心,请大侠们帮帮忙,看看有什么好办法实现这么一个简单的功能,跪求~
...全文
309 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2014-04-21
  • 打赏
  • 举报
回复
引用 7 楼 wddw1986 的回复:
[quote=引用 6 楼 mznxbc123456 的回复:] [quote=引用 5 楼 wddw1986 的回复:] 2,打开启动画面。 这里要么用ShowDialog,要么自己做DoEvent,总之要保证主线程在那等待而且要处理消息泵。
进入启动画面
Application.Run(new Form1()); 
这个是主画面,个人觉得还不能用线程去打开。而且我要处理主画面的load必须先把这个主画面打开,我总不能在不打开主画面的基础上对主画面进行操作吧[/quote] 你的逻辑从头就错了当然觉得处处都别扭。[/quote] 这就是连基本语法概念都不学,“做几个项目,自然就会了”的后果。
mznxbc123456 2014-04-21
  • 打赏
  • 举报
回复
引用 11 楼 xdashewan 的回复:
你为什么要在program里启动from1呢,Application.Run(new Form1()); 你就不能先启动LoadPic吗
这个问题说的很好 http://bbs.csdn.net/topics/390765680?page=1#post-397232335 我试了很多办法了 我知道这是一个简单的问题~ 可就是解决不了
xdashewan 2014-04-21
  • 打赏
  • 举报
回复
你为什么要在program里启动from1呢,Application.Run(new Form1()); 你就不能先启动LoadPic吗
mznxbc123456 2014-04-21
  • 打赏
  • 举报
回复
引用 9 楼 xdashewan 的回复:
遮住很正常,要么先启动LoadPic,要么就把LoadPic塞到进程里去启动
这就又回到原点了,发了这么多帖子解决这个问题~让我更深入明白了.net的机制。program.cs中main函数结尾必须是run。跳到主画面去。就算你用线程操作也是没用的!这个问题关键就是显示logo的时候主画面的显示牵连到了控件,所以必须要有线程去打开主画面,这就是错误。
xdashewan 2014-04-21
  • 打赏
  • 举报
回复
遮住很正常,要么先启动LoadPic,要么就把LoadPic塞到进程里去启动
mznxbc123456 2014-04-21
  • 打赏
  • 举报
回复
引用 7 楼 wddw1986 的回复:
[quote=引用 6 楼 mznxbc123456 的回复:] [quote=引用 5 楼 wddw1986 的回复:] 2,打开启动画面。 这里要么用ShowDialog,要么自己做DoEvent,总之要保证主线程在那等待而且要处理消息泵。
进入启动画面
Application.Run(new Form1()); 
这个是主画面,个人觉得还不能用线程去打开。而且我要处理主画面的load必须先把这个主画面打开,我总不能在不打开主画面的基础上对主画面进行操作吧[/quote] 你的逻辑从头就错了当然觉得处处都别扭。[/quote] 恩 可能一开始就错了 那大神能解释下如下的代码嘛?
private void Form1_Load(object sender, EventArgs e)
        {
            LoadPic form = new LoadPic();           
            form.Show();
            form.TopMost = true;

            this.Hide();
            //激活窗体,不要让treeview获得焦点
            this.Select();
            this.TopMost = false;
            //GetMenu(plcView);            
            BindType();
            BindData();

            cmb_Temp.Visible = false;
            cmb_Temp.SelectedIndexChanged += new EventHandler(cmb_Temp_SelectedIndexChanged);
            
            dtViewPlc.Controls.Add(cmb_Temp);
            InitPort();
            ShowTreeView(plcView);

            form.Close();
        }
这样的操作是否合理?为什么我的LoadPic画面一直看不到,被主画面挡住了。这时候设置TopMost怎么感觉一点效果都没有~
cheng2005 2014-04-21
  • 打赏
  • 举报
回复
引用 6 楼 mznxbc123456 的回复:
[quote=引用 5 楼 wddw1986 的回复:] 2,打开启动画面。 这里要么用ShowDialog,要么自己做DoEvent,总之要保证主线程在那等待而且要处理消息泵。
进入启动画面
Application.Run(new Form1()); 
这个是主画面,个人觉得还不能用线程去打开。而且我要处理主画面的load必须先把这个主画面打开,我总不能在不打开主画面的基础上对主画面进行操作吧[/quote] 你的逻辑从头就错了当然觉得处处都别扭。
mznxbc123456 2014-04-21
  • 打赏
  • 举报
回复
引用 5 楼 wddw1986 的回复:
2,打开启动画面。 这里要么用ShowDialog,要么自己做DoEvent,总之要保证主线程在那等待而且要处理消息泵。
进入启动画面
Application.Run(new Form1()); 
这个是主画面,个人觉得还不能用线程去打开。而且我要处理主画面的load必须先把这个主画面打开,我总不能在不打开主画面的基础上对主画面进行操作吧
cheng2005 2014-04-21
  • 打赏
  • 举报
回复
2,打开启动画面。 这里要么用ShowDialog,要么自己做DoEvent,总之要保证主线程在那等待而且要处理消息泵。
mznxbc123456 2014-04-21
  • 打赏
  • 举报
回复
引用 2 楼 wddw1986 的回复:
啰里吧嗦写了一大堆,一看就是门外汉的思路。 编程最重要的是用正常思维去思考问题。 在这个问题上,什么是正常思维,那就是UI的事情让主线程去做,悄悄进行的工作让子线程去做。 简单来说就几步, 1,启动子线程(是用Thread还是Task随意)。 2,打开启动画面。 3,子线程工作结束,进行回调,关了启动画面,进行下一步正常启动流程。 如果处理过程中想刷新UI,那么就回调进行刷新。 就这么简单直白,楼主竟然好意思说“这么一个简单的功能我当然没放在眼里”,真是无知者无畏
帖子被你鄙视了 确实是门外汉 你的1 2 3步我都做了 正常启动画面就进入主画面了。
cheng2005 2014-04-21
  • 打赏
  • 举报
回复
啰里吧嗦写了一大堆,一看就是门外汉的思路。 编程最重要的是用正常思维去思考问题。 在这个问题上,什么是正常思维,那就是UI的事情让主线程去做,悄悄进行的工作让子线程去做。 简单来说就几步, 1,启动子线程(是用Thread还是Task随意)。 2,打开启动画面。 3,子线程工作结束,进行回调,关了启动画面,进行下一步正常启动流程。 如果处理过程中想刷新UI,那么就回调进行刷新。 就这么简单直白,楼主竟然好意思说“这么一个简单的功能我当然没放在眼里”,真是无知者无畏
xdashewan 2014-04-21
  • 打赏
  • 举报
回复
为什么不换个思路,让主进程先启动自定义的logo画面,然后在logo画面里读各种地址,然后读完关闭自己,启动主画面,需要的话把部分参数传过去,画面传值的方法多的是

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧