C 只允許執行乙個例項

2021-07-03 11:47:36 字數 1539 閱讀 1994

互斥程序(程式), 簡單點說,就是在系統中只能有該程式的乙個例項執行. 現在很多軟體都有這功能,如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...