Qt:讓程式實現單例模式,只能開啟一次
阿新 • • 發佈:2019-01-29
介紹
讓程式實現單例模式,只能開啟一次,這已經是一個老生常談的問題了。
方法也有很多,比如說監聽埠,檔案鎖。我這裡介紹一個用共享記憶體的方法。
先上程式碼
程式碼部分
- 程式碼部分(.h檔案):
namespace JQFoundation
{
bool singleApplication(const QString &flag);
bool singleApplicationExist(const QString &flag);
}
- 程式碼部分(.cpp檔案):
#if !(defined Q_OS_IOS) && !(defined Q_OS_ANDROID) && !(defined Q_OS_WINPHONE)
bool JQFoundation::singleApplication(const QString &flag)
{
static QSharedMemory *shareMem = nullptr;
if (shareMem)
{
return true;
}
shareMem = new QSharedMemory( "JQFoundationSingleApplication_" + flag );
for ( auto count = 0; count < 2; ++count )
{
if (shareMem->attach( QSharedMemory::ReadOnly ))
{
shareMem->detach();
}
}
if ( shareMem->create( 1 ) )
{
return true;
}
return false;
}
#else
bool JQFoundation::singleApplication(const QString &)
{
return true;
}
#endif
#if !(defined Q_OS_IOS) && !(defined Q_OS_ANDROID) && !(defined Q_OS_WINPHONE)
bool JQFoundation::singleApplicationExist(const QString &flag)
{
QSharedMemory shareMem( "JQFoundationSingleApplication_" + flag );
for ( auto count = 0; count < 2; ++count )
{
if (shareMem.attach( QSharedMemory::ReadOnly ))
{
shareMem.detach();
}
}
if ( shareMem.create( 1 ) )
{
return false;
}
return true;
}
#else
bool JQFoundation::singleApplicationExist(const QString &)
{
return false;
}
#endif
介面
只有兩個介面,使用都很簡單,傳入的引數就是一個標記字串
- singleApplication
檢查單例模式,並且上鎖。返回true表示上鎖成功,false表示失敗。
- singleApplicationExist
檢查單例模式,但不上鎖。返回true表示已經有鎖,false表示無鎖。
使用
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
if ( !JQFoundation::singleApplication( "myApplication" ) )
{
qDebug() << "Application already running";
return -1;
}
return a.exec();
}
注意
在移動平臺上,共享記憶體不一定是可靠的,所以在移動平臺上就用條件編譯跳過了,畢竟移動平臺上一般程式都已經是單例模式了。