禁止程序多次运行

前言

在做机房收费系统中又考虑到一个问题,我最后打包后的应用程序如果多次打开又会出现怎么样的情形呢?果不其然,竟然出现多个程序的画面。如果用户没有关闭当前运行的应用程序,又打开同样的程序的话,那么由于两个程序占用同一个端口,这时就会产生错误。下面就用两种方法为大家介绍下如何避免这种问题的发生。

方法一:使用互斥量禁止程序运行多次

源代码

 private void Frm_Main_Load(object sender, EventArgs e)
        {
            bool Exist;//定义一个bool变量,用来表示是否已经运行
            //创建Mutex互斥对象
            System.Threading.Mutex newMutex = new System.Threading.Mutex(true,"仅一次",out Exist);
            if (Exist)//如果没有运行
            {
                newMutex.ReleaseMutex();//运行新窗体
            }
            else
            {
                MessageBox.Show("本程序一次只能运行一个实例!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息
                this.Close();//关闭当前窗体
            }
        }

关键技术

Mutex类:表示一个同步基元,也可用于进程间同步。

语法如下:

Public Mutex(boolinitiallyOwned,string name,out bool createdNew)

参数说明

  1. initiallyOwned:如果为True,则给予调用线程已命名的系统互斥体的初始所属权。
  2. Name:Mutex的名称,如果未NULL,则Mutex使未命名的。
  3. createdNew:在该方法返回时,如果创建了局部互斥体或指定的命名系统互斥体,则包含布尔值true;如果指定的命名系统互斥体已存在,在为False

4.         
ReleaseMutex方法:用来释放Mutex对象

说明:Mutex类位于System.Threading命名空间下

方法二:使用进程名禁止程序多次运行

通过判断进程名来实现禁止程序运行多次

源代码

 private void Frm_Main_Load(object sender, EventArgs e)
        {
            bool Exist;//定义一个bool变量,用来表示是否已经运行
            //创建Mutex互斥对象
            System.Threading.Mutex newMutex = new System.Threading.Mutex(true,"仅一次",out Exist);
            if (Exist)//如果没有运行
            {
                newMutex.ReleaseMutex();//运行新窗体
            }
            else
            {
                MessageBox.Show("本程序一次只能运行一个实例!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息
                this.Close();//关闭当前窗体
            }
        }

关键技术

(1).Path类的GetFileNameWithoutExtension方法

该方法用来返回不具有扩展名的指定路径字符串的文件名

语法规则

Public static string GetFileNameWithoutExtension(stringpath)

参数说明

  1. Path:文件路径
  2. 返回值:包含由GetFileName返回的字符串string

(2)Process类的GetProcessesByName方法

用来创建新的Process组件的数组,并将它们与共享指定的进程名称的所有现有进程资源关联。

语法规则

Public static Process[] GetProcessesByName(stringprocessName)

参数说明

  1. processname:进程的友好名称
  2. 返回值:Process类型的数组,表示运行指定应用程序或文件的进程资源。

小结:

方法一是通过一个Mutex类来创建一个互斥的量的应用程序,然后通过判断应用程序是否已经打开,如果打开的话,则关闭现有的应用程序;方法二则是通过Path类来先得到应用程序的运行路径,然后根据路径来创建相应的应用程序数组,最后通过数组长度来来判断当前打开的应用程序的实例,如果数组值大于1的话,则给出提示。



禁止程序多次运行,布布扣,bubuko.com

时间: 2024-10-13 12:49:25

禁止程序多次运行的相关文章

WinForm 应用程序禁止多个进程运行

方法一: 禁止多个进程运行 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace 开启新的进程 { static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { bool flag; Syst

.NET概念:.NET程序编译和运行

.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net 程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然后编译为微软中间语言代码,运行的时候即时编译为本地机器语言,同时.NET代码运行时有一个CLR环境来

C语言学习笔记之第一个C程序及编译运行(一)

一.第一个C程序 1>C程序由函数构成 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 2>C程序的入口 C程序的入口是一个名字叫做main的函数,简称main函数.(为了区分函数,每一个函数都有一个名称)也就是说,不管整个程序中有多少个函数,都是先执行main函数.不管main函数写在文件中间,还是文件末尾,也都是先执行main函数. 注意: 如果一个C程序中没有main函数,那么

C#防止程序多次运行

经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行.所以只限于用在单用户环境,还是不太完美. class Program { [STAThread] static void Main(string[] args) { //防止程序多次运行 if (!OneInstance.IsFirst("MyTest")) { Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!");

【转】delphi程序只允许运行一个实例的三种方法:

一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' {MainForm}; {$R *.res} var hAppMutex: THandle; //声明互斥变量 begin hAppMutex := CreateMutex(nil, false,’projectname’); //创建互斥对象projectname工程名称 if ( (hAppM

MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误

今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc.CFileView等类,一进去就编译运行(就是最初自动生成的项目),编译通过,可运行时直接弹出错误框,有点小懵,,,啥都没做就给我看这个: 图一   错误提示框 后来搜索一查,网上好多类似的错误以及解决方案,几乎都试了个遍,有: 方法(1)-重新生成解决方案,或者将项目文件目录下Debug文件夹删了,重新生成Release版: 方法(2)-可以先声明一个临时的C

PHP实现程序单例运行

原创文章,转载请注明出处:http://huyanping.sinaapp.com/?p=222 作者:Jenner 一.场景描述: 最近我们一块业务,需要不断的监听一个目录的变化,如果目录中有文件,则启动PHP脚本处理掉.最初的方案是使用crontab执行sh脚本,脚本大概如下: SOK=`ps -ef |grep /www/sender.sh | grep -v grep|wc -l` if [[ "$SOK" < "2" ]];then for f in

Linux之nohup命令:实现退出终端后程序继续后台运行

转自:http://tech.ccidnet.com/art/302/20070618/1115599_1.html 简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦:另一种方法是仍然用普通方法编程,然后用nohup命令启动程序: nohup<程序名>& 则控制台logout后,进程仍然继续运行,起到守护进程的作

自己手写WEB程序框架并运行

1.新建文件夹,起名MyWeb 2.文件夹下,新建两个文件夹 WEB-INF, META-INF,,还可以新建一些jsp,html文件 ,如 index.html 3在WEB-INF中必须存在一个文件WEB.xml, 还包含两个文件夹 lib, classes 4 在WEB.xml中写入最简单的<web-app> ....  </web-app>,,,,,编辑一下index.html 下面是要运行了 1,cmd 2,切换到MyWeb的文件夹,jar 命令查看一下各个参数的含义 3,