QT笔记:同一个程序在 windows 和 linux双系统,都只能同时运行一个
作者:互联网
第一种方式:使用QSystemSemaphore和QSharedMemory
优点:无需调用其他代码或者库,直接使用即可,操作方便
缺点:在某种意思上,仅在windows系统下生效。原因是 QSharedMemory 在两个系统中的处理方式不一样,
windows:它 “不拥有” 共享内存段,当所有 “将QSharedMemory实例附加到特定共享内存段的线程或进程,都已销毁其QSharedMemory实例或退出时,Windows内核会自动释放共享内存段”;
Linux:它 “拥有” 共享内存段,但与Windows不同的是,如果软件是正常退出,也就是通过销毁其QSharedMemory实例与特定共享内存段分离,Unix内核会释放共享内存段;但如果软件在没有运行QSharedMemory析构函数的情况下崩溃,则共享内存段会在崩溃中幸存下来,导致无法继续运行此软件。
实现方式:
QSystemSemaphore sema("JAMKey",1,QSystemSemaphore::Open); sema.acquire();// 在临界区操作共享内存 SharedMemory QSharedMemory mem("SystemObject");// 全局对象名 if (!mem.create(1))// 如果全局对象以存在则退出 {
QMessageBox::information(nullptr, "提示","An instance has already been running.");
sema.release();// 如果是 Unix 系统,会自动释放。
return 0; } sema.release();// 临界区
第二种方式:使用QtSingleApplication
与第一种实现方式的优缺点相反,其避免了在linux系统中,由于软件崩溃导致无法继续运行软件的问题,但是需要调用qt源码。
这里我采用的是把源代码直接编译到工程内,方便工程移植使用。
1,在网站上下载QtSingleApplication压缩包;
2,在当前程序路径下新建文件夹qtsingleapplication和qtlockedfile。将qtlocalpeer.cpp、qtlocalpeer.h、qtsingleapplication.cpp、qtsingleapplication.h、qtsinglecoreapplication.cpp、qtsinglecoreapplication.h拷贝到qtsingleapplication文件夹下;
将qtlockedfile.cpp、qtlockedfile.h、qtlockedfile_unix.cpp、qtlockedfile_win.cpp拷贝到qtlockedfile文件夹下。
3,修改pro文件:
win32 { SOURCES += qtlockedfile/qtlockedfile_win.cpp } unix { SOURCES +=qtlockedfile/qtlockedfile_unix.cpp } SOURCES += \ qtsingleapplication/qtlocalpeer.cpp \ qtsingleapplication/qtsingleapplication.cpp \ qtsingleapplication/qtsinglecoreapplication.cpp \ qtlockedfile/qtlockedfile.cpp HEADERS += \ qtsingleapplication/qtlocalpeer.h \ qtsingleapplication/qtsingleapplication.h \ qtsingleapplication/qtsinglecoreapplication.h \ qtlockedfile/qtlockedfile.h
4,需要包含QtNetwork,可以在 pro文件加上 QT += network;
5,在main函数添加:
QtSingleApplication a("test", argc, argv); if(a.isRunning()) { QMessageBox::information(nullptr, "提示","An instance has already been running."); return 0; }
我调用的时候还出现了几个问题,一个是命名空间问题,需要在 qtlockedfile.cpp、qtlockedfile_win.cpp、qtlockedfile_unix.cpp开头加上 using namespace QtLP_Private; 还有一个是头文件调用需要加上相对路径。
标签:双系统,QT,windows,sema,qtsingleapplication,qtlockedfile,cpp,QSharedMemory,共享内存 来源: https://www.cnblogs.com/orville/p/16358352.html