【NCRE】---登录窗体应用“单例模式”

         昨天,经过了一天的奋战,我们小组做的《计算机一级考试系统》终于上线了,虽然还是有很多的不足和自身处理问题上与别人的差距,可是自己前天晚上熬夜和这一个月以来总是不停的往学校跑也算是有所回报!剩下的就是静静等待15号的来临---经历更大的考验---两个学校同时用我们的系统考试!希望还是可以顺利通过!
   好了,充满美好希望的话说完,开始正题!
   前天,在测试的时候我们发现,我们的系统可以在一个电脑上同时多次登录!
如下图:
【NCRE】---登录窗体应用“单例模式”_第1张图片
【NCRE】---登录窗体应用“单例模式”_第2张图片

这样导致的一个问题就是:好多学生无意间会启动两个考试系统的进程,在资源管理器中会出现两个名为“UI”的进程,这样在判分的时候就会出现错误!所以师姐就说可以弄一个单例模式啊!

    这个任务其实是派给梦甜的,可是我由于好奇也和梦甜一起研究了!
    因为做机房的时候用过单例模式,当时的感觉就是这还不是简单的啊!由于做机房的时候我们是在点击一个按钮出来的时候让他只出来一个窗体,所以我们就想到把按钮的代码写到这个登录窗体load的时候就可以实现了!实践以后发现,咦??怎么点击登录快捷方式还是出现两个登录界面呢???

    后来赵崇师哥就去研究这个问题:发现这和真正的单例是有区别的!
    真正的单例是在一个线程中,就是点击这个按钮窗体弹出这是写在按钮下面,而且用的是窗体的load而不是new一个窗体!而我们的登录窗体的实例化是写在Program.cs中,如下图:
 
可以明显的看出来它是new一个窗体,而new一个窗体和load一个窗体明显是不同的,所以我们把单例的代码写在load中根本就不起作用!
    所以师哥就提出来一个想法:检查资源管理器,如果资源管理器中已经运行着一个UI的进程,那么就给他一个提示这个软件已经运行,不可以再次登录!
    接下来就是一系列的查资料,终于给找到了这么一段代码。在这里我就引用一下师哥发现并修改的代码。所以Program.cs里面的代码就是:
 
namespace UI
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);            
            bool createNew;
            using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
            {
                if (createNew)
                {
                    //Application.Run(new FrmTeacherLogin());
                    Application.Run(new FrmLogin());
                    //Application.Run(new frmAddStudent());
                }
                else
                {
                    MessageBox.Show("考试系统已经在运行中...");
                    System.Threading.Thread.Sleep(1000);
                    System.Environment.Exit(1);
                }
            }               
        }
    }
}



总结:
     如果有什么感兴趣的事情,一定要跟着事情的发展走,走到最后你就会发现答案!发现仍在继续,学习仍在继续,一级仍在继续!加油!


你可能感兴趣的:(【NCRE】---登录窗体应用“单例模式”)