做网站cookie传值,云梦网站建设,做网站最常用的软件是什么,学做网站怎么样参考 【实现QT单例程序 QSystemSemaphore QSharedMemory】 做了一点点更改#xff0c;主要是在openEuler上用时遇到的一点问题。
QSharedMemory *unimem nullptr;
void checkExist()
{QString memName SingleApp; // 注意这名字要每个工程不一样#xff0c;否…参考 【实现QT单例程序 QSystemSemaphore QSharedMemory】 做了一点点更改主要是在openEuler上用时遇到的一点问题。
QSharedMemory *unimem nullptr;
void checkExist()
{QString memName SingleApp; // 注意这名字要每个工程不一样否则不同的exe可能会冲突// 信号量的意义把操作共享内存的代码锁住。因为有可能同时点击2次APP, 防止并发QSystemSemaphore sema(memName Key, 1, QSystemSemaphore::Open);qDebug() sema.acquire: sema.acquire();#ifdef Q_OS_LINUX/* Windows平台上不存在应用程序崩溃后共享内存段还存在的情况* LINUX应用程序崩溃后,共享内存段不会自动销毁,则该程序再次运行会出问题* 所以程序启动时先去检查是否有程序崩溃后还存留的共享内存段如果有先销毁,再创建*/QSharedMemory mem(memName);// 尝试将进程附加到共享内存段if (mem.attach()) {// 将共享内存与主进程分离, 如果此进程是附加到共享存储器段的最后一个进程则系统释放共享存储器段即销毁内容mem.detach();}else{// 假如权限不足的话也是无法attach的qDebug() linux: mem.errorString();}
#endif/** 每个App打开的时候获取一次共享内存。* 如果获取失败说明是第一个启动的APP直接创建共享内存就好了。假如创建失败,说明不是第一个直接退出就好了。* 如果获取成功说明不是第一个也是直接退出就好了。* 保证App在系统里只能打开一个。*/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(已经有一个实例在运行即将退出);std::cout QString(已经有一个实例在运行即将退出).toLocal8Bit().data() std::endl;exit(0);}
}在主函数实例化Application后调用即可。 int main(int argc, char *argv[])
{QApplication a(argc, argv);checkExist();...
}