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