單例模式 Windows下防止多開簡介

2021-09-26 03:07:43 字數 1402 閱讀 8724

單例模式(singleton pattern)是一種常見的軟體設計模式,在使用這個模式時,單例物件的類必須保證在全域性中有且只有乙個例項存在,並且提供了乙個全域性訪問的介面,這樣有利於我們協調系統整體的行為。

1.在某個伺服器程式中,所以的配置資料都在乙個檔案中存放,這時可以統一使用乙個單例物件對配置進行讀取,然後其他的模組都可以呼叫該物件來對獲取當前配置資訊

2.在windows下,任務管理器就是單例模式的經典應用之一,保證整個系統只能有乙個task manager的物件。

3.許多windows應用程式存在著系統托盤,這個也是單例模式的一種應用,隱藏在右下角方便使用者進行操作。整個exe中有且只有乙個托盤物件,防止程式多開導致的一系列bug,比如說已經執行當前exe,在雙擊開啟程式是不會被再拉起乙個登入介面。

4.多執行緒的執行緒池物件一般是使用的單例模式,這樣方便對池衝的執行緒進行管理。

由於目前正在做客戶端開發,所以本文在win32平台下實現,順便簡單介紹一下windows防多開的實現,在windows下有許多程式在設計時是不允許使用者多開的,那麼如何實現呢?在這裡分享乙個windows下的解決方案:互斥體防多開。主要原理是使用win32 api createmutexw函式

createmutexw( _in_opt_ lpsecurity_attributes lpmutexattributes, _in_ bool binitialowner, _in_opt_ lpcwstr lpname);
來生成乙個與當前程式相關的互斥體,當再次執行是會檢測當前互斥體是否再執行,如果是則退出程式,關於createmutexw函式的用法網上有許多部落格介紹,這裡具體說明下lpname引數的作用,lpname主要是作為互斥體名稱傳入引數的,那麼這個引數該如何選擇呢?這個時候可以使用uuid, uuid是乙個根據標準方法生成、不依賴**機構的註冊和分配且具有全網唯一的乙個128位識別符號,使用這個作為互斥體的名稱可以做到真正的互斥。下面說說具體實現:

首先需要定義乙個物件的結構體,用於存放檔案控制代碼以及判斷是否在單例模式下。

建構函式的設計主要是使用唯一uuid作為單例物件的互斥名稱,建立了程式的控制代碼,呼叫此函式時,可以把本地生成的uuid當作函式引數key傳入,根據getlasterror()函式返回值來確定m_inmode的值。

析構函式的設計就比較簡單了,可以先判斷是否在單例模式下,如果是則關閉當前檔案控制代碼即可

struct singletionmode::context ;

// 單例模式

struct singletionmode ;

//建構函式

singletionmode::singletionmode(const std::wstring &key)

//析構函式

singletionmode::~singletionmode()

windows下程序單例

有時候需要讓程序單例執行,以防止多個例項導致異常,windows下可以使用系統事件來實現,比如event mutex等,event和mutex在建立的時候如果物件已存在,getlasterror會返回error already exists,可以以此實現程序單例 handle createevent...

防止重複建立視窗 單例模式

我們經常會遇到這種情況 單擊窗體上乙個按鈕,彈出乙個子窗體,當再次單擊按鈕是,還會彈出乙個同樣的窗體,我們肯定不希望這樣。這個問題我們可以通過 單例模式 解決,那麼什麼是 單例模式 單例模式的意思就是只有乙個例項。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單...

php 單例模式 多頁面,PHP單例模式的實現

單例模式的意義在於,很多時候不需要建立重複的例項。用php實現單例模式的原理是,使用乙個靜態變數儲存例項,當遇到重複的 new 操作時,直接返回靜態變數中儲存的例項。典型的應用有資料庫類,請看 class db 儲存例項的靜態變數 public static instance 構造方法私有化 不能直...