C QT PC端 防止程式重複啟動的幾種方式

2021-09-24 01:37:55 字數 1563 閱讀 4027

在做客戶端的過程中,我們通常會希望程式例項只執行一次,也就是只希望同時啟動乙個程式。所以今天就總結一下幾種防止程式重複啟動的方式:

qlockfile 使用檔案提供在不同的程序間的鎖。鎖檔案可以放置多個程序同時訪問同一資源。例如磁碟上的配置檔案、套接字、埠、共享記憶體區域等。使用的時候trylock()對資源進行上鎖。當程式執行的時候,上鎖成功後,會自動生成檔案(例如生成的是磁碟上的檔案),檔案中包含程序id, 程序名稱,當前使用者名稱這三個資訊。

正常退出時,lock檔案會被自動刪除。如果程式崩潰,lock檔案還會繼續存在,當然也會繼續阻止程序啟動。

由於這個原因,qfilelock嘗試去lock的時候,會首先根據寫入檔案的程序id,去查詢程序裡所有的程序id。如果沒有檔案中的程序id,則認為lock檔案已過期,並重新lock成功。

如果恰巧所有的程序裡,剛好有這個程序id,這時候就會把記錄lock檔案裡的程序名稱進行比較。

如果程序名也相同,則上鎖失敗,啟動程序失敗。如果只是程序id相同,但程序名不同,還是會認為lock檔案已經過期。可以加鎖。

此外,qlockfile還考慮了鎖檔案最後修改時間(預設30秒)。如果發現鎖檔案已經過期,則刪除。

具體使用時:

if (!lockfile ->trylock(2000))

qt程式中,提供了qsharedmemory來讓單一的執行緒或者程序鎖定共享記憶體。來保證執行緒或者程序互斥。

使用的時候很簡單

if(!singleton.create(1))

我們在處理執行緒同步的時候,會通常用到互斥量。它是乙個核心物件。系統中一次只能建立乙個。 如果你再次建立乙個同名的就會出錯。就是理由這個原理來達到只能同時執行一次的效果。

if(getlasterror() == error_already_exists)

我們可以根據程序名稱,通過列舉當前所有程序,檢查是否已經在執行。由於當前程式執行的時候,程序中肯定已經存在了乙個我們要檢測的程序名稱,所以,最終檢測所有的程序名稱至少會有乙個。所以程式已經執行的時候,至少會檢測到兩個程序名。

我們就可以通過檢測所有的程序名有2次及其以上出現 就可以說明程式已經啟動了。

static bool mainwindow::running()

}bmore=::process32next(hprocesssnap,&pe32);

delete m_char;

}return count > 1 ? true : false;;

}bool runing = mainwindow::running();

if (runing)

我們可以通過windows系統函式,通過程式的視窗名稱(objname),來查詢窗體是否存在,如果存在標識程式已經啟動。我們就不允許本次啟動。

如果這樣我們不建議將主視窗名稱設定為常見的名稱。最好設定有標識性質的,防止與其他程式視窗名稱相同。

我們可以使用spy++ 檢視窗體的名稱。

使用的時候:

#include #include 

if (null != hpbwnd)

//continue...

防止程式重複執行的單元

防止程式重複執行的單元 工程引用此單元就能防止同時出現多個例項 unitmultinst inte ce uses windows messages,sysutils,classes,forms implementation const str unique mi gethandle 2 var i...

防止程式被重複執行

防止程式被重複執行 第一法 windows95的程式一般都可以重複執行,例如你按下win e組合鍵即啟動資 源管理器,如果再按win e組合鍵又會出現乙個資源管理器,這兩個程式互不幹 擾。有時候你可以需要製作這樣乙個程式 當該程式已經執行時,若使用者企圖 再次執行該程式則只會啟用那個已執行的程式,而...

ABAP 防止程式重複執行

有的程式需要現在同一時間只能執行乙個,這種需求可以用鎖的方式來實現,在start of selection 事件後加鎖,如果是加鎖成功,說明還沒有程式在執行,如果是加鎖失敗,則說明已經有同名程式在執行,報錯即可。注 這個鎖是借用程式修改的鎖,在se38修改程式的時候也會加這個鎖。程式如下 start...