ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-06-09 10:33:33  阅读:164  来源: 互联网

标签:双系统 QT windows sema qtsingleapplication qtlockedfile cpp QSharedMemory 共享内存


  第一种方式:使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有