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