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

原文连接

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实现进程通信
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值