保證乙個程式只執行一次

2022-01-30 06:52:41 字數 1260 閱讀 1148

相信如果學過作業系統的朋友一定能夠看的懂.  

可以使用   waithandle.waitone   請求互斥體的所屬權。擁有互斥體的執行緒可以在對   wait   的重複呼叫中請求相同的互斥體而不會阻塞其執行。但執行緒必須呼叫   releasemutex   方法同樣多的次數以釋放互斥體的所屬權。如果執行緒在擁有互斥體期間正常終止,則互斥體狀態設定為終止,並且下乙個等待執行緒獲得所屬權。如果沒有執行緒擁有互斥體,則互斥體狀態為終止。

方法一:使用mutex來進行

1.首先要新增如下的namespace:

using

system.threading;

2.修改系統main函式,大致如下:

bool bcreatednew;

//create a new mutex using specific mutex name

mutex m =new mutex( false, "myuniquename", out bcreatednew );

if( bcreatednew )

如上面編碼就可以了,要注意的一點是,在給mutex起名字的時候,不要太簡單,以防止和其他程式的mutex重複,從而達不到所預想的效果。

方法二:使用process來進行

1.首先要新增如下的namespace:

using

system.diagnostics;

using

system.reflection;

2.新增如下函式:

public

static process runninginstance() }

} //no other instance was found, return null.

return

null;

} 3.

修改系統main函式,大致如下:

if( runninginstance() == null )

如上面編碼就可以了,要注意的一點是,在判斷程序模組檔名是否相等這部分的**,是可選的。如果當前的程式在檔案系統中只存在乙個的話,以上的方法是可以的;否則不要刪除這部分的**。

對比兩種方法,就效率和簡便性來說,前一種方法是最好的,也是我比較喜歡的;後一種方法,速度比較慢,其次通過processname去系統中查尋,有可能查出來的process並不是我想要得,雖說在後面加了檔案目錄判斷,但是其含有潛在的問題(前面已經說出來)。不過,第一種方法也有缺陷,就是擴充套件性操作不方便,例如:讓程式只執行一次,如果程式已經執行,把它彈出並顯示到最前面。對於此,後一種方法就很有優勢了。

只執行乙個程式

重複執行程式會造成系統資源的浪費 這句話真彆扭 很多情況 下我們把程式最小化或者隱藏起來,想用這個程式的時候會習慣的doulbeclick程式的圖示,wo 又乙個程式執行了,我們本意是既然已經是開啟的程式,你把程式再給我顯現出來不就可以了?弱智的程式設計師阿 不是說你,也不是說我,假想。常見的方法有...

Windows讓程式只執行一次

一 通過建立互斥量來判斷 winapi winmain hinstance,hinstance,lpstr,int if getlasterror error already exists catch exception exception return 0 二 用系統原子 winapi winma...

VC程式只執行一次例項

方法一 建立全域性互斥體,然後在程序啟動時檢查該互斥體是否已被建立 只需要在initinstance 中加入 方法二 乙個程式可以執行多個例項 程序 那我們如何讓它僅執行乙個例項呢?很簡單,使用 pragma編譯器指令在程序的位址空間內建立乙個 共享節 就可以 達到目的,這個 共享節 裡的資料為多個...