系统相关
首页 > 系统相关> > QT笔记:同一个程序在 windows 和 linux双系统,都只能同时运行一个

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