wordpress 網(wǎng)易云跟帖重慶seo公司怎么樣
參考
【實現(xiàn)QT單例程序 QSystemSemaphore QSharedMemory】
做了一點點更改,主要是在openEuler上用時遇到的一點問題。
QSharedMemory *unimem = nullptr;
void checkExist()
{QString memName = "SingleApp"; // 注意這名字要每個工程不一樣,否則不同的exe可能會沖突// 信號量的意義,把操作共享內存的代碼鎖住。因為有可能同時點擊2次APP, 防止并發(fā)QSystemSemaphore sema(memName + "Key", 1, QSystemSemaphore::Open);qDebug() << "sema.acquire:" << sema.acquire();#ifdef Q_OS_LINUX/* Windows平臺上不存在應用程序崩潰后,共享內存段還存在的情況* LINUX應用程序崩潰后,共享內存段不會自動銷毀,則該程序再次運行會出問題* 所以程序啟動時先去檢查是否有程序崩潰后還存留的共享內存段,如果有,先銷毀,再創(chuàng)建*/QSharedMemory mem(memName);// 嘗試將進程附加到共享內存段if (mem.attach()) {// 將共享內存與主進程分離, 如果此進程是附加到共享存儲器段的最后一個進程,則系統(tǒng)釋放共享存儲器段,即銷毀內容mem.detach();}else{// 假如權限不足的話,也是無法attach的qDebug() << "linux:" << mem.errorString();}
#endif/** 每個App打開的時候,獲取一次共享內存。* 如果獲取失敗,說明是第一個啟動的APP,直接創(chuàng)建共享內存就好了。假如創(chuàng)建失敗,說明不是第一個,直接退出就好了。* 如果獲取成功,說明不是第一個,也是直接退出就好了。* 保證App在系統(tǒng)里只能打開一個。*/unimem = new QSharedMemory(memName);bool isRunning = false;if (unimem->attach()) {isRunning = true;} else {bool ret = unimem->create(1);if(ret == false) // 主要是改了這里{qDebug() << "create uniMem:" << ret << unimem->error() << unimem->errorString();if(unimem->error() != QSharedMemory::NoError){isRunning = true;}}else{isRunning = false;}}sema.release();if (isRunning) {// qWarning() << QStringLiteral("已經(jīng)有一個實例在運行,即將退出");std::cout << QString("已經(jīng)有一個實例在運行,即將退出").toLocal8Bit().data() << std::endl;exit(0);}
}
在主函數(shù)實例化Application后,調用即可。
int main(int argc, char *argv[])
{QApplication a(argc, argv);checkExist();...
}