最近發現很多人在論壇中問到如何防止程式被多次執行的問題的,如: 所以這裡就記錄下來,希望給遇到同樣問題的朋友有所參考的,同時也是對自己的乙個積累。在介紹具體實現**之前,我們必須明確解決這個問題的思路是什麼的?下面只要分享我的乙個思考的這個問題的方式:
當我們點選乙個exe檔案時,此時該exe程式將會執行,我們可以看到該程式的介面,對於計算機而言,就是會在系統上開啟乙個該程式的進行,這個我們可以通過任務管理器來檢視的(當我們點選exe之後,程式執行,系統會建立乙個與與程式同名的程序)
既然我們要防止程式執行多次,也就是說程式只能執行一次,從作業系統的角度來講就是該程式的程序只能是唯一的,分析到這裡我們自然就想到了,要保證該程式程序只有乙個,我們就要判斷下該程式程序是否在自己的作業系統上執行了,如果已經執行了乙個程序,當我們下次執行exe的時候,此時不是再開啟該程式程序,而是退出,彈出乙個提示框告訴使用者該程式已經執行,如果作業系統沒有執行該程式程序,則執行這個程式。
從而這個問題就轉換為判斷該程式程序的數量問題了,此時我們就想.net 有沒有提供乙個類可以獲得該程序名的數量,如果數量大於1則說明該程式已經執行了,小於就表明程式沒有執行。如果熟悉.net類庫的人肯定知道.net類庫中有乙個process類,該類的意思就是乙個程序的抽象。(有些人就會說,我一開始不知道有這個類那怎麼辦呢?那就是考驗你英文了,因為程序的英文就是process,然而所有程式語言的命名都很通俗易懂,此時就可以用process在msdn上搜尋,這樣你也就發現這個類了)
除了第三點中提出找程序數量的思路外,還有另外一種實現思路就是——我們能不能讓執行乙個程序的時候,讓該程序具有乙個變數,該變數是唯一標識該程序,當點選exe檔案預建立乙個改程式程序時,我們去判斷這個變數是否存在,如果存在就說明這個程序已經執行,從而退出本次的程式,並且提示給使用者說該程式已經執行。
從上面的分析過程中可以看出,我們解決這個問題的思路就是從程序入手,第三點的思路就是直接從程序數量入手,而第四點思路也是從程序入手,只是做了乙個變換罷了,讓乙個變數來唯一標識乙個程序,當變數存在時說明該程式程序也執行了。
弄懂了主要的實現思路之後,下面看**實現就完全不是問題了,使用互斥量的實現就是第四點的思路的體現,我們用為該程式程序建立乙個互斥量mutex物件變數,當執行該程式時,該程式程序就具有了這個互斥的mutex變數,如果再次執行該程式時,通過檢查該互斥變數是否存在(來替換檢測這個程序是否存在),如果存在則說明程式已執行,否則就沒執行。這裡需要注意的是:從我的多執行緒同步的文章大家可以知道,mutex類也可以對執行緒進行同步,那是不是其他對執行緒同步的類也可以解決本專題中的問題呢?答案是否定,之所以mutex類可以解決這個問題,是因為mutex類除了可以對執行緒同步,也可以對程序同步。下面就具體看看實現**吧:
using//如果該程式程序數量大於,則說明該程式已經執行,則彈出提示資訊並提出本次操作,否則就建立該程式system;
using
system.threading;
using
system.windows.forms;
namespace
onlyinstancerunning
//程式已經執行的情況,則彈出訊息提示並終止此次執行
else
}#endregion
} }
}
if (processcollection.length >= 1
)
else
#endregion
usingsystem;
using
system.diagnostics;
using
system.reflection;
using
system.runtime.interopservices;
using
system.windows.forms;
namespace
way3
else
#endregion
}
#region 方法三定義的方法
//////獲取正在執行的程式,沒有執行的程式則返回null
/// ///
private
static
process runninginstance()}}
return
null
; }
//////
顯示已執行的程式
/// ///
private
static
void
handlerunninginstance(process instance)
#endregion
}}
using四種實現方式的執行效果都是差不多的,這裡就以實現方式一作為演示的,具體實現效果如下圖:system;
using
system.diagnostics;
using
system.runtime.interopservices;
using
system.windows.forms;
namespace
way4
else}}
}else
#endregion
} }
}
寫這個專題主要是看到原因是看到論壇中有些朋友問了這樣的問題,並且本人也回答了,所以就總結下具體的實現**來幫助遇到同樣問題的朋友做乙個參考,同時也是對自己乙個學習的積累和複習。下面附上程式所有原始碼:
本專題程式原始碼:
C 防止程式多次執行
經過我的測試,還比較好用,但是有個問題,如果不登出,用另乙個使用者進入,則程式不能判斷出已執行。所以只限於用在單使用者環境,還是不太完美。class program console.writeline 正在執行中 console.readline public static class oneins...
Delphi 防止程式多次執行
program project1 uses forms,windows,unit1 in unit1.pas var hmutex hwnd ret integer begin hmutex createmutex nil,false,test ret getlasterror if ret err...
如何防止乙個程式執行多次
讓程式只執行乙個例項 delphi篇 windows 下乙個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮 比如安全性 我們要做出一些限制,讓程式只能夠執行乙個例項。在delphi程式設計中,...