当前位置: 首页 > ops >正文

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;
 
};
 
http://www.xdnf.cn/news/10961.html

相关文章:

  • SEO博客资源必备
  • c语言中switch语句流程图_C语言干货,新手入门必看,基础知识大汇总!
  • 草帽船长(梦想海贼王)全套源码:客户端+服务端+资源+文档
  • fckeditor上传图片问题的解决
  • 家里网线的接法和顺序
  • PDF开源库libharu的折腾之旅
  • 刚整理出来的网址
  • 高校图书馆网站
  • LeetCode刷题(97)~旅行终点站
  • 关于pcAnywhere使用的一点说明
  • c# System.Reflection 反射
  • dedecms标签大全
  • 什么是SEO?
  • Div+CSS布局入门教程
  • 照相馆选照片管理_家庭娱乐:与照相馆和Windows Live空间共享照片
  • 该内存不能为“read”的几个解决方案
  • Zigzag扫描Matlab实现
  • 虚拟机Ubuntu开启出现:An internal error occurred during:
  • 网页技术革命:精美绝伦的 HTML5 个人作品集网站
  • 取消 UpdatePanel 更新
  • [Java Web]Response对象
  • AMD双核所有驱动,补丁,优化下载地址和安装方法
  • 信息安全概论(期末知识点复习)_信息安全8个安全目标与需求可存活性内容(1)
  • 使用Python抓取豆瓣电影评论并分析词云生成词云图
  • 【Element进阶】1、深入理解Element UI的国际化
  • 国内外 Ubuntu 衍生版比较
  • 基于ssm网络教学平台的设计与实现论文
  • 启动程序出现msvcrt40.dll文件丢失问题解决
  • 【中创】壹起共享“免费”网络资源库-持续更新中
  • 【网络安全】简单的免杀方法(非常详细)零基础入门到精通,收藏这一篇就够了