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 
#include 
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 单实例进程(禁止多开))