Qt 防多开

防止多开传统的做法有文件锁(如Eclipse的.lock文件), 进程间通信等.

但是使用文件锁方式原实例无法知晓有新实例试图启动, 从而置顶自己的窗口.


进程间通信可以使用共享内存. 如使用启动中的腾讯qq来登录qq音乐.也可以使用server, socket这样讨巧的方法

Qt本身没有提供一个跨平台的防多开解决方案, 官方推荐的QSingleApplication解决方案并不包含在Qt的library中,并且貌似是遵从商业协议而非社区版本. 所以需要我们自己来实现一个.


使用共享内存和文件锁的一个缺点是,程序一旦异常退出, 可能导致下一次无法正常启动 (还记得要去手动删除Eclipse的.lock文件的时候吧)

而使用QLocalServer和QLocalSocket结合QSharedMemory可以很好的实现多开的检查以及对先前实例的唤醒.


参考链接:http://www.qtcentre.org/wiki/index.php?title=SingleApplication#Introduction

我的实际例子

// singleApplication.h
#ifndef SINGLEAPPLICATION_H
#define SINGLEAPPLICATION_H
 
#include <QApplication>
#include <QSharedMemory>
#include <QLocalServer>
#include "dlgmain.h"
 
class SingleApplication : public QApplication
{
 
    Q_OBJECT
 
public:
    explicit SingleApplication(int &argc, char* argv[], const QString uniqueKey);
 
    bool isRunning();
    bool sendMessage(const QString & message);
 
public slots:
    void receiveMessage();
    void showMainWindow();
 
signals:
    void messageAvailable(QString message);
 
private:
    bool _isRunning;
    QString _uniqueKey;
    QSharedMemory sharedMemory;
    QLocalServer* localServer;
 
    static const int timeout = 1000;
 
};
 

                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值