1. 程式人生 > >Qt:讓程式實現單例模式,只能開啟一次

Qt:讓程式實現單例模式,只能開啟一次

介紹

讓程式實現單例模式,只能開啟一次,這已經是一個老生常談的問題了。

方法也有很多,比如說監聽埠,檔案鎖。我這裡介紹一個用共享記憶體的方法。

先上程式碼

程式碼部分

  • 程式碼部分(.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();
}

注意

在移動平臺上,共享記憶體不一定是可靠的,所以在移動平臺上就用條件編譯跳過了,畢竟移動平臺上一般程式都已經是單例模式了。