1. 程式人生 > >應用程式單例

應用程式單例

注1:最簡單辦法,建立系統核心物件(IPC中很多,如windows event/mutex...),檢查核心物件是否建立成功,如不成功app退出,成功繼續啟動。

注2:建立共享區,如

#pragma data_seg("flag_data")
int app_count = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")

app判斷app_count即可。

Qt共享記憶體計數方式(小題大做)

singleinstancesharedmemory.h

#ifndef SINGLEINSTANCESHAREDMEMORY_H
#define SINGLEINSTANCESHAREDMEMORY_H
#include <QSharedMemory>

//Note: Call addRef first
class SingleInstanceSharedMemory : public QSharedMemory
{
	Q_OBJECT

public:
	SingleInstanceSharedMemory(const QString &key, QObject *parent = nullptr);
	~SingleInstanceSharedMemory();
<pre name="code" class="cpp"><pre name="code" class="cpp">	int addRef();
	int releaseRef();
	bool isRunning();
private:
        <span style="font-family: Arial, Helvetica, sans-serif;">bool incrementIns();</span>
bool decrementIns();};#endif // SINGLEINSTANCESHAREDMEMORY_H singleinstancesharedmemory.cpp
#include "singleinstancesharedmemory.h"

SingleInstanceSharedMemory::SingleInstanceSharedMemory(const QString &key, QObject *parent/* = nullptr*/)
	: QSharedMemory(key,parent)
{
}

SingleInstanceSharedMemory::~SingleInstanceSharedMemory()
{

}
bool SingleInstanceSharedMemory::decrementIns()
{
	if(this->isAttached())
	{
		lock();
		char *data = (char*)this->data();
		*data = '0';
		unlock();
		return true;
	}
	return false;
}

bool SingleInstanceSharedMemory::incrementIns()
{
	if(this->isAttached())
	{
		lock();
		char *data = (char*)this->data();
		*data = '1';
		unlock();
		return true;
	}
	return false;
}	

bool SingleInstanceSharedMemory::isRunning()
{
	if(this->isAttached())
	{
		char ret;
		lock();
		char *data = (char*)this->data();
		ret = *data;
		unlock();
		if ('1' == ret)
		{
			return true;
		}
	}
	return false;
}

int SingleInstanceSharedMemory::addRef()
{
	 if (!create(1)) 
	 {
		 if (QSharedMemory::AlreadyExists == error())
		 {
			 //SharedMemory has already existed
			 if (attach())
			 {
				 lock();
				 char data = *((char*)this->data());
				 unlock();
				 if ('1' == data)
				 {
					 return QSharedMemory::AlreadyExists;
				 }
			 }
		 }
	 }
	if(incrementIns())
	{
		return QSharedMemory::NoError;
	}
	else
	{
		return QSharedMemory::UnknownError;
	}

}

int SingleInstanceSharedMemory::releaseRef()
{
	if(decrementIns())
	{
		return QSharedMemory::NoError;
	}
	else
	{
		return QSharedMemory::UnknownError;
	}
}

程式啟動時:

	SingleInstanceSharedMemory *share_memory = new SingleInstanceSharedMemory(QString("SingleInstanceApplication"));
	if(QSharedMemory::AlreadyExists == share_memory->addRef())
	{
		//ShowAppMainWindow();
		return 0; 
	} 
如果有登出,可呼叫:
   share_memory->releaseRef()

相關推薦

C# FrameworkAPI之Mutex實現應用程式

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace DemoCSDN {

應用程式

注1:最簡單辦法,建立系統核心物件(IPC中很多,如windows event/mutex...),檢查核心物件是否建立成功,如不成功app退出,成功繼續啟動。 注2:建立共享區,如 #pragma data_seg("flag_data") int app_count =

mfc應用程式

在App的InitInstance()中新增:HANDLE hMutex = CreateMutex(NULL, FALSE, _T("exe"));if (GetLastError() == ERRO

設計模式與應用模式

簡介 物件建立型模式 核心:一個類只生成唯一例項物件,構造方法私有化禁止外部建立物件。GoF對單例模式的定義是:保證一個類只有一個例項存在,同時提供能對該例項加以訪問的全域性訪問方法(靜態方法) 總結就是如下: - 類中唯一例項引用 -

C# windows應用程式例項執行例項

public class Program    {        private const int WS_SHOWNORMAL = 1;         public const Int32 AW_BLEND = 0x00080000;        [DllImport(

Volatile的應用DCL模式(四)

Volatile的應用 單例模式DCL程式碼 首先回顧一下,單執行緒下的單例模式程式碼 /** * 單例模式 * * @author xiaocheng * @date 2020/4/22 9:19 */ public class Singleton { private static Si

Java枚舉enum以及應用:枚舉實現模式

tee configure adr 自由 這樣的 pre 單例模式 做到 build 枚舉作為一個常規的語言概念,一直到Java5才誕生不得不說有點奇怪,以至於到現在為止很多程序員仍然更喜歡用static final的形式去命名常量而不使用,一般情況下,Java程序員用這種

Java設計模式之《模式》及應用場景

urn vol 運行 www 同步問題 href 外部 占用 模式 轉載參考:http://www.cnblogs.com/V1haoge/p/6510196.html 所謂單例,指的就是單實例,有且僅有一個類實例,這個單例不應該由人來控制,而應該由代碼來限制,強制單例。

Python設計模式中模式的實現及在Tornado中的應用

實例 類變量 attribute rap all wrap 線程 ++ 出現 單例模式的實現方式 將類實例綁定到類變量上 class Singleton(object): _instance = None def new(cls, *args): if not isinst

設計模式的應用場景Runtime、Timer

(下面程式碼所需要的包都是java.util下的) import java.util.Date; import java.util.Timer; import java.util.TimerTask; Runtime:獲取執行時物件 public static void

建立型:模式及相關應用

文章目錄 單例模式(Singleton) 優缺點 重點 懶漢式實現 執行緒不安全 synchronized關鍵字 雙重校驗鎖 靜態內部類 餓漢式實現 單例模式

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD,如1999年1月12日應輸入為19990112),程式將判斷兩個日期的先後順序,以及兩個日期之間的間隔天數(

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。  

【Anychart教程】在您的Xamarin應用程式中建立美觀且使用者友好的表

下載Telerik UI for Asp.Net最新版本 幾乎每個移動應用都有收集使用者輸入的場景。正是考慮到這一點,我們為Xamarin的Telerik UI引入了Entry控制元件,以幫助您建立漂亮且使用者友好的表單。 在Telerik UI中為Xamarin引入新條目 用於Xama

模式、懶漢模式以及餓漢模式的區別及應用

1.單例模式 單例模式就是系統執行期間,有且僅有一個例項。它有三個必須滿足的關鍵點: (1)一個類只有一個例項。這是滿足單例模式最基本的要求,若滿足這個關鍵點,只能提供私有的構造器,即保證不能隨意建立該類的例項。示例如下: //讀取配置檔案的工具類—單例模式 public class Con

模式的理解及應用

單例模式 單例模式定義:定義:確保某個類只有一個例項,而且自行例項化提供給外部使用。 單例模式有很中比較常用的有懶漢模式和餓漢模式。注:我在網上查說的比較多的模式,在專案中比較常看到的有懶漢模式。餓漢模式沒怎麼看過。 懶漢模式: public c

Android中模式的應用

單例模式在我們日常開發中或多或少都會遇見,使用場景也是多種多樣。今天根據專案中需求,正好用到了單例模式。在此記錄一下。 一、跟隨app存活 有什麼方式,可以讓一個變數跟隨app存活呢?是一個單例模式維護的靜態工具類。靜態工具類程式碼一般都使用單例模式來實現,可以防止建立多

C# wpf建立例項應用程式(8)

1,新建一個wpf專案,找到App.xmal.cs開啟後插入如下程式碼: namespace ElectronicNeedleTherapySystem { /// <summary> /// App.xaml 的互動邏輯 /// </sum

C#機房重構之模式應用

前言 好久沒好好寫部落格了,掐指一算,2個多月了。今天給大家帶來一篇實用的單例模式實現攻略。   正文 單例模式的目的 我們的機房重構總是有一個主窗體,在主窗體中開啟其他窗體時,其實只要你願意是可以不斷開啟100個的。但如果這樣,既影響使用者體驗,又無實際意義。這時

01.JavaGOF23-建立型模式-模式-應用場景_餓漢式_懶漢式

Windows的Task Manager(工作管理員)就是很典型的單例模式 windows的Recycle Bin(回收站)也是典型的單例應用。在整個系統執行過程中,回收站一直維護著僅有的一個例項。 專案中,讀取配置檔案的類,一般也只有一個物件。沒有必要每次使用配置檔案資料,每次new一個物件去讀取。 網站

Vue系列(1):頁面應用程式

前言:關於頁面上的知識點,如有侵權,請看 這裡 。 關鍵詞:SPA、單個 HTML 檔案、全靠 JS 操作、Virtual DOM、hash/history api 路由跳轉、ajax 響應、按需載入、MVVM SPA 我們先來看一下在百科上面的解釋吧,emmmm,一般呢,我每次搜尋一些不懂的詞,都會