美文网首页C++/Qt
Qt 单实例进程(禁止多开)

Qt 单实例进程(禁止多开)

作者: 哦呵呵y | 来源:发表于2020-08-19 18:06 被阅读0次

Qt实现单实例进程一般有3种方式:
QLocalServer
QSharedMemory
QtSingleApplication

一、QLocalServer

QLocalSocket类提供了一个本地socket。
通过connectToServer判断服务端是否存在来禁止多开

    //连接LocalServer
    QString serverName = "localserver";
    QLocalSocket socket;
    socket.connectToServer(serverName);
    if(socket.waitForConnected(1000)) return(-1);
  
// 如果连接成功,说明已经存在指定的LocalServer,说明已经有应用启动了,此时直接退出应用即可
// 如果没有指定的LocalServer存在,则connectToServer会返回错误信息,此时创建LocalServer
    
    //创建LocalServer
    QLocalServer server;
    if (server.listen(serverName)) {
        // 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除之
        if(server.serverError()== QAbstractSocket::AddressInUseError){
            QLocalServer::removeServer(serverName); 
            server.listen(serverName);
        }
    }
二、QSharedMemory
#include <QCoreApplication>
#include <QSharedMemory>
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    //创建的同时设置key,也可以setKey
    QSharedMemory sm("test_shared");
    if(sm.attach())
        return 0;
    sm.create(1);
    MainWindow w;
    w.show();
    return a.exec();
}

原理很简单,create()之后才可以attach,所以如果attach成功,就说明有应用存在
But

Unix: QSharedMemory "owns" the shared memory segment. When the last thread or process that has an instance of QSharedMemory attached to a particular shared memory segment detaches from the segment by destroying its instance of QSharedMemory, the Unix kernel release the shared memory segment. But if that last thread or process crashes without running the QSharedMemory destructor, the shared memory segment survives the crash.
如果最后一个线程或进程在没有运行QSharedMemory析构器的情况下崩溃,共享内存段会在崩溃时幸存下来。

三、QtSingleApplication

QTSingleApplication,是Qt官方提供的 http://code.qt.io/cgit/qt-solutions/qt-solutions.git/

  1. 用于实现只启动一个实例
  2. 启动时向另一个实例通信,已存在的实例可以通过socket消息激活窗口
    实现原理
  3. 通过flock对文件加锁来判断是否已经存在实例
  4. 通过QLocalServer、QLocalSocket实现进程通信

相关文章

  • Qt 单实例进程(禁止多开)

    Qt实现单实例进程一般有3种方式:QLocalServerQSharedMemoryQtSingleApplica...

  • OCA

    单实例体系结构实例由内存结构和进程组成 构成实例的进程称为后台进程系统全局区 SGA 实例启...

  • qt 共享内存 单例

    QT 进程间通信之古老的方法(内存共享) 让QT只运行一个实例 以上两篇文章中分别讲述了QSharedMemory...

  • Qt设计模式:单实例

    基本思想 私有化类的构造函数,作用:不允许在栈上创建对象或使用new操作符创建对象; 通过静态公有方法,如命名为:...

  • 设计模式-创建模式-单例模式

    顾名思义,一个进程只允许有一个实例,禁止类外创建实例,只能通过静态的GetInstance方法获取实例。比较简单,...

  • 《Qt5开发及实例》

    《Qt5开发及实例》Qt是诺基亚公司的C++可视化开发平台,目前最新版本为Qt 5。《Qt5开发及实例》以Qt 5...

  • 实例、连接和会话关系

    MySQL服务器Instance实例和进程 1、MySQL是单进程多线程(oracle是多进程),也就是说mysq...

  • QProgressDialog

    Qt进度条实例

  • Windows程序阻止多开

    在程序中,有时候我们禁止程序多开,一般采用: 内核对象互斥 进程检测 上面两种方法为最常见有效。 使用Mutex ...

  • 2020-04-17-Android本地广播的实现原理

    getInstance LocalBroadcastManager实现了一个单例模式,每个进程只能获取到一个实例。...

网友评论

    本文标题:Qt 单实例进程(禁止多开)

    本文链接:https://www.haomeiwen.com/subject/keddjktx.html