同乙個應用程式只開啟乙個的方法

2022-09-09 00:15:15 字數 2731 閱讀 3720

msdn中

mutex類

中是這樣解釋的:乙個同步基元,也可用於程序間同步。

其實個人感覺更容易理解的解釋是:

互斥鎖(mutex)

互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。

互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況。

如果要獲取乙個互斥鎖。應呼叫互斥鎖上的waitone()方法,該方法繼承於thread.waithandle類。

它處於等到狀態直至所呼叫互斥鎖可以被獲取,因此該方法將組織住主調執行緒直到指定的互斥鎖可用,如果不需要擁有互斥鎖,用releasemutex方法釋放,從而使互斥鎖可以被另外乙個執行緒所獲取。

這是我改自msdn上的方法(其實也沒改多少):

1

using

system;

2using

system.threading;34

class

test

5", i + 1

);16

mythread.start();17}

1819

//20

//run until all foreground threads h**e exited.21}

2223

private

static

void

mythreadproc()

2427

28//

this method represents a resource that must be synchronized

29//

so that only one thread at a time can enter.

30private

static

void

useresource()

31 has entered the protected area",

36thread.currentthread.name);

3738

//place code to access non-reentrant resources here.

3940

//simulate some work.

41 thread.sleep(500

);42

43 console.writeline("

is le**ing the protected area\r\n",

44thread.currentthread.name);

4546

//release the mutex.

47mut.releasemutex();48}

49 }

view code

其實說白了就是:這個坑兒(mutex mutex)誰蹲下,別個就只能等(mutex.waitone();),只有等蹲坑那個人爽完了(mutex.releasemutex();),等待的那個人才能去蹲,然後再讓另外的人去等待....

在程式的program.cs裡面,先新增如下**:

先定義乙個互斥鎖: mutex 

bool flag = false

; flag);

個引數:

true--給呼叫執行緒賦予互斥體的初始所屬權

//第乙個引數:互斥體的名稱

//第三個引數:返回值,如果呼叫執行緒已被授予互斥體的初始所屬權,則返回true

if (!flag)

}

getexistprocesses()和 setforeground(process instance)的實現如下,這兩個方法的作用就是:如果互斥體發現已經存在同名的互斥,就找到當前同名的程序,然後把這個進行的主窗體顯示到螢幕的最前端。

private

static process getexistprocess()

}return

null

; }

private

static

bool

isthesamemainmodule(process currentprocess, process process)

catch

(win32exception)

return

true

; }

private

static

void

setforegroundwindow(process instance)

}[dllimport(

"user32.dll

", exactspelling = true

)]

public

extern

static

bool showwindowasync(handleref hwnd, int

ncmdshow);

[dllimport(

"user32.dll

", charset = charset.auto, exactspelling = true

)]

public

extern

static

bool setforegroundwindow(handleref hwnd);

view code

MFC防止同乙個exe應用程式多次啟動

initinstance initinstance afxenablecontrolcontainer 建立 shell 管理器,以防對話方塊包含 任何 shell 樹檢視控制項或 shell 列表檢視控制項。cshellmanager pshellmanager new cshellmanager...

乙個主機同乙個UDP埠,可以開啟幾次

在我的潛意識裡,我一直認為乙個埠只可以開啟1次,如果這個主機有多個網絡卡的話,每個網絡卡都可以在這個埠收發資料,最近一段時間除錯同一主機內不同網絡卡之間 資料的功能,才發現,socket針對同乙個埠不僅可以多次繫結,其中可以根據不同的本地ip多次繫結同一埠,也可以根據繫結不同網絡卡多次繫結同一埠,看...

通過C 開啟乙個應用程式

system.diagnostics.processstartinfo info new system.diagnostics.processstartinfo 設定外部程式名 info.filename eclipse.exe 設定外部程式工作目錄為 c info.workingdirectory...