【IT168 专稿】前些天,用VS.NET2008开发一个PDA的项目;这个PDA是基于Windows CE的操作系统;用户有个需求,当这个应用程序一旦开起来,如果他想再点击运行,就提醒他:该程序已经运行;于是本人就建议小兄弟用Mutex类实现,最后他告诉我不可以;用Mutex类去开发一般Windows 程式,会比较容易,但如果拿他去开发Windows CE的程式,就有些说词,本文就是基于这样的背景下展开的.
Mutex单词是“互斥”的意思; 同性相斥,异性相吸(人类活动的多样性,早已打破这一铁定的规律,动物界应该还严格遵守这一约定…呵呵,题外话.);
Mutex更详细的解释,就是mutual exclusion 对象的缩写;用一句计算机的行话来说,一个互斥体就是一个程序对象,它允许多个线程来共享相同的资源;例如对文件的访问,但并不允许同时访问;这在我们使用的过程中能体会到,比如你打开一个文件,你接着再打开一次的时候,它就提醒你,当前的应用程序已经打开,你是否继续等..;当一个程序运行起来的时候,这个互斥体就产生了,且带有唯一的名字;学过操作系统的,都会有这个概念叫互斥;上学的时候,老师举了个很好例子来说明,比如你在火车上,那个厕所就是很好的互斥体;你要用这个厕所,别人就不能用,直到别人使用完,你才能用,即使你闹肚子也不行,^-^..; 你打电话有时候也会遇到这种情况;如:该电话正在忙,请稍候再拨!
闲话少说,那么在大家编程的时候,有时候用户有这样的需求,这个程序只要开启一次,如果有人想继续开启,就提醒他,这个应用程序正在运行;
对Visual Studio.NET开发人员来讲,如果设计一个传统的Window Form程序好像就比较简单,用Mutex很容易解决这样的需求; 如下代码:
[VB.NET]
Imports System.Threading
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'定义Mutex的类
Dim objMutex As Mutex
'得到应用程序的名称
Dim AppName As String = Assembly.GetExecutingAssembly().GetName().Name
'用这个应用程序的名字,去实例化这个Mutex
objMutex = New Mutex(False, AppName)
'判断是否有相同的应用程序在运行;
If objMutex.WaitOne(0, False) = False Then
objMutex.Close()
objMutex = Nothing
MessageBox.Show("这个程序正在运行!")
‘或者为了更通俗些,也可写成下面的代码;
MessageBox.Show("该电话正在忙,请稍候再拨!")
Close() '关闭这个应用程序
Exit Sub
End If
End Sub
这里强调下面的代码:
这里的AppName就很重要,如果你忽略这样的参数,你的上述的函数就失去了原有的意义;