互斥程序(程式), 簡單點說,就是在系統中只能有該程式的乙個例項執行. 現在很多軟體都有這功能,如maxthon 可以設定為"只允 許開啟乙個窗體",還有bitcomet等. 我也是看到這些軟體的這個功能才來研究這個問題的. 要實現程式的互斥,通常有三中方式,下面 用 c# 語言來實現:
實現方式一: 使用執行緒互斥變數. 通過定義互斥變數來判斷是否已執行例項.c#實現如下:
把program.cs檔案裡的main()函式改為如下**:
這種方法 在debug 下正常 但是如果到release版本下會始終返回true 需要把mutex 改為靜態成員變數
說明:程式中通過語 句 system.threading.mutex run = new system.threading.mutex(true, "xinbiao_a_test", out runone); 來申明乙個互斥體變數run,其中"xinbiao_a_test"為互斥體名,布林變數runone用來儲存是否已經執行了該程式事例.
實現方式二: 採用判斷程序的方式,我們在執行程式前,查詢程序中是否有同名的程序,同時執行位置也相同程,如是沒有執行該程式,如果有就就不執行.在c#中應用system.diagnostics名字空間中的process類來實現,主要**如下:
1,在program.cs檔案中新增函式如下:
public static system.diagnostics.process runninginstance() }
} //no other instance was found, return null.
return null;
} 2,把main ()函式改為如下**:
實現方式三:全域性原子法,建立程式前,先檢查全域性原子表中看是否存在特定原子a(建立時新增的),存在時停止建立,說明該程式已執行了乙個例項;不存在則執行程式並想全域性原子表中新增特定原子a;退出程式時要記得釋放特定的原子a哦,不然要到關機才會釋放。c#實現如下:
1、申明winapi函式介面:
[system.runtime.interopservices.dllimport("kernel32.dll")]
public static extern uint32 globaladdatom(string lpstring); //新增原子
[system.runtime.interopservices.dllimport("kernel32.dll")]
public static extern uint32 globalfindatom(string lpstring); //查詢原子
[system.runtime.interopservices.dllimport("kernel32.dll")]
public static extern uint32 globaldeleteatom(uint32 natom); //刪除原子
2、修改main()函式如下:
3、在formclosed事件中新增如下**:
globaldeleteatom(globalfindatom("xinbiao_test"));//刪除原子"xinbiao_test"
只允許程式執行乙個例項
有兩類方法 第一類 判斷程序是否存在,如果存在則直接退出。第二類 最簡單也是最準確的方法,用命名的互斥物件。如下 m hmutex 可以是成員變數,全域性變數或者是區域性變數 m hmutex createmutex null,false,t not imide if m hmutex 在呼叫 cr...
C WinForm程式只允許執行乙個例項
只允許程式執行乙個例項,也就是說你只能雙擊執行乙個程式一次,第二次雙擊執行將看到某某警告,只有關閉程式再開。方法有很多種 mutex執行緒互斥變數法,程序查詢法,全域性原子法。其中第一種簡單實用,其它兩種 只允許執行乙個例項 檢視。mutex執行緒互斥變數法 在program.cs檔案中修改 boo...
實現同時只允許執行乙個程式例項
方法一 從這裡開始執行 stathread static void main region 確保只有乙個例項 public static process runninginstance return null private static void handlerunninginstance pro...