程序运行实例数量的控制
標 題:程序運行實例數(shù)量的控制——大全篇[原創(chuàng)]
發(fā)信人:bellkwong
經(jīng)常會碰到有人問如何保證程序只運行一個實例,原來我也零碎的給過兩三個方法,今天干脆來個大總結,希望對大家在做程序設計的時候有所幫助。
????一個程序只運行一個實例(或限制實例數(shù)量)通常可以采用如下方法:
1)FindWindow 之<窗口標題>
????通過查找窗口標題來確定上一實例是否正在運行,不適合窗口標題動態(tài)變化的程序。
2)FindWindow 之<任務欄按紐標題>
????通過查找任務欄按紐標題來確定上一實例是否正在運行,不適合按紐標題動態(tài)變化的程序(如Winamp)。通常情況下,該方法還是優(yōu)先考慮,因為按紐標題是一般是固定的。
3)Window Property
????將某個數(shù)據(jù)(可以是字符串或句柄)通過SetProp加入到指定窗口的property list,程序運行時枚舉窗口并檢查該數(shù)據(jù)是否存在來確定上一實例是否正在運行。
4)全局Atom
????將某個特定字符串通過GlobalAddAtom加入全局原子表(Global Atom Table),程序運行時檢查該串是否存在來確定上一實例是否正在運行。該方法有個局限,就是程序終止前必須顯式調用GlobalDeleteAtom來釋放atom,否則該atom不會自動釋放,如果程序運行時意外終結了,那么下一個實例就無法正常執(zhí)行。早期版本的realplayer就存在這個現(xiàn)象,不知道是不是采用了該方法。
5)Mutex/Event/Semaphore
????通過互斥對象/信號量/事件等線程同步對象來確定實例是否存在,在NT下要注意權限問題(SID)。
6)DLL全局共享區(qū)域
????VC下的DLL工程可以通過下面代碼來建立一個進程間共享數(shù)據(jù)段:
????#pragma data_seg(".share")
????//shared for all processes that attach to the dll
????DWORD dllgs_dwRunCount = 1; //一定要在這里對變量進行初始化,否則工夫白做!
????#pragma data_seg()
????#pragma comment(linker,"/section:.share,rws")
?????
????導出3個函數(shù),分別為:
????DWORD IncRunCount(void); //運行計數(shù)器加1,返回計數(shù)器結果
????DWORD DecRunCount(void); //運行計數(shù)器減1,返回計數(shù)器結果
????DWORD GetRunCount(void); //取當前運行計數(shù)器
?????
????由于DLL全局共享段在映射到各個進程地址空間時僅會被初始化一次,并且是在首次被windows加載時,所以利用該共享段數(shù)據(jù)就能對程序實例進行可靠計數(shù)。
7)內存映射文件(File Mapping)
????通過把程序實例信息(如窗口句柄、計數(shù)器等等)放置到跨進程的內存映射文件,同樣可以控制程序實例運行的數(shù)量,道理與DLL全局共享區(qū)域類似。
8)其它
????曾經(jīng)見過有人通過注冊表、磁盤文件等途徑來處理實例控制問題,但由于這些參考對象均為非易失性資源,在碰到程序非正常結束且沒有清除實例標識時相當麻煩,真正使用起來具有很大的局限性。
????總結:前面三種方法適用于擁有窗體的程序,而后面幾種則沒有這個限制,但相對而言后者實現(xiàn)起來較復雜。不管采用哪種方法,參考對象均必須具有可共享、跨進程、易失性、重啟自復位等必要性質。
轉載于:https://www.cnblogs.com/okwary/archive/2008/12/25/1362528.html
總結
以上是生活随笔為你收集整理的程序运行实例数量的控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]SQL Server 2000执行
- 下一篇: C# 语法练习(4): 类型转换