`
tcspecial
  • 浏览: 914556 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

让QT只运行一个实例

    博客分类:
  • QT
阅读更多

      目前使QT运行一个实例有三种方式:

        1.QSharedMemory

      使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动.

     2. QtSingleApplication

     使用QT扩展库QtSingleApplication,能很好的解决这个问题. 详见: http://qt.nokia.com/products/qt-addons/solutions-archive. 里面就是用的QLocalServer/QLocalSocket建立本地socket来判断实例是否存在

     3. 利用QLocalServer实现

 

     MyApplication.h

   

class MyApplication:public QApplication
{
    Q_OBJECT
public:
    MyApplication(int argc,char **argv);

    bool isRunning();

private slots:
    void newLocalConnection();

private:
    QLocalServer *server;

    bool _isRunning;
};

    

 

    MyApplication.cpp

 

  

MyApplication::MyApplication(int argc, char **argv):QApplication(argc,argv)
{
    _isRunning=false;

    QCoreApplication::setApplicationName("localserver");
    QString serverName=QCoreApplication::applicationName();

    QLocalSocket socket;
    socket.connectToServer(serverName);

    if(socket.waitForConnected(500))
    {
        QTextStream stream(&socket);
        QStringList args=QCoreApplication::arguments();

        if(args.count()>1)
        {
            stream<<args.last();
        }else
        {
            stream<<QString();
        }
        stream.flush();
        qDebug()<<"Connected server,program will quit";

        socket.waitForBytesWritten();

        /**
         *qApp->quit(); 此代码是用来退出事件循环的;在构造函数中,事件循环
         *尚未启动,因此就无法退出. 最好就是设置标志判断在外部判断
         */


        _isRunning=true;

        return;
    }

    qDebug()<<"Can't connect to server,build a server";
    server=new QLocalServer(this);
    connect(server,SIGNAL(newConnection()),this,SLOT(newLocalConnection()));

    if(server->listen(serverName))
    {
        //防止程序崩溃时,残留进程服务,移除之
        if(server->serverError()==QAbstractSocket::AddressInUseError&&QFile::exists(server->serverName()))
        {
            QFile::remove(server->serverName());
            server->listen(serverName);
        }
    }


}


void MyApplication::newLocalConnection()
{
    QLocalSocket *socket=server->nextPendingConnection();
    if(!socket)
        return;

    socket->waitForReadyRead(1000);

    //显示传入参数值
    QTextStream in(socket);
    QString vl;
    in>>vl;
    qDebug()<<"The value is: "<<vl;

    delete socket;
}


bool MyApplication::isRunning()
{
    return _isRunning;
}

  

 

 

 主程序:

  main.cpp

  

int main(int argc,char **argv)
{
    MyApplication app(argc,argv);
    if(app.isRunning())
        return 0;

    QLabel label;
    label.setText("Hello world");
    label.show();

    return app.exec();
}

  

 

   第一个实例:

  第一个实例

 

 第二个实例

  • 大小: 11 KB
  • 大小: 12.4 KB
分享到:
评论

相关推荐

    Qt实现程序单实例运行

    在IT开发领域,尤其是使用Qt库进行C++应用程序设计时,有时我们需要确保程序只能有一个实例在运行,防止多个实例同时启动导致数据冲突或其他问题。本文将深入探讨如何使用Qt实现程序单实例运行的两种方案,并对提供...

    Qt5开发及实例(完整版)

    1. 成熟稳定:Qt5是Qt框架的第五个主要版本,经过多年的发展和测试,已经非常成熟和稳定。 2. 社区支持:Qt5拥有庞大的开发者社区,你可以轻松找到大量的教程、解决方案和第三方库。 3. 平台支持:Qt5可以在各种操作...

    实现QT应用程序单实例的方法,并且支持根据需要弹出已经运行的程序窗口

    使用共享内存和信号量实现QT应用程序单实例的方法,并且支持根据需要弹出已经运行的程序窗口,解决了同类软件存在的问题,而且程序非常简单。

    QT开发及实例.zip

    QT开发及实例.zip这个压缩包文件是针对QT开发的一个详细教程,主要面向使用C++语言进行编程的开发者。QT是一个跨平台的开发框架,由Qt Company提供,被广泛应用于创建图形用户界面(GUI)应用程序,同时也支持命令行...

    Qt值得保存的实例

    Qt是一个强大的跨平台应用程序开发框架,由The Qt Company开发并维护。它被广泛用于创建桌面、移动和嵌入式系统的用户界面和应用程序。Qt库提供了丰富的API,支持C++编程,同时也通过Qt Quick(QML)提供声明式编程...

    qt5开发及实例(附源码)

    在“Qt5开发及实例(完整版).pdf”中,你可能会学习到如何安装QT5开发环境,创建第一个QT项目,理解信号和槽机制,以及如何使用Q widgets和QML来构建UI。源代码部分会包含各种实例,例如简单的按钮点击事件处理,复杂...

    QT5开发及实例 陆文周电子版

    QT5提供了丰富的库和工具,简化了UI设计、网络通信、数据库操作等多个领域的编程任务。本资料“QT5开发及实例 陆文周电子版”应包含关于QT5的基本概念、核心组件、设计模式以及实战应用等内容。 首先,QT5的基础...

    QT5开发及实例 (pdf+源码)

    它由The Qt Company提供,并且拥有一个强大的社区支持。QT5不仅限于GUI,还能处理网络、数据库、多媒体等多方面的应用开发。本资源包含QT5的开发教程以及源码实例,对于学习和提升QT5编程技能极具价值。 PDF教程...

    QT可视化教程及实例

    接着,通过两个实际案例来加深理解,一个是小球碰撞游戏,另一个是简单绘图系统。这些案例都有配套的源代码供读者学习和实践。 首先,文档提到了C++程序设计课程设计实习指导书,由夏军宝编写,来自中国地质大学...

    免费QT学习实例

    QT,全称Qt,是一个跨平台的C++图形用户界面应用程序开发框架,由挪威的Trolltech公司(现为The Qt Company)开发,被广泛应用于桌面应用、移动应用以及嵌入式系统中。QT的学习资源丰富多样,尤其适合初学者和有经验...

    QT5实例及源码.zip

    QT5是Qt库的第五个主要版本,是一个强大的跨平台应用程序开发框架,广泛用于创建桌面、移动和嵌入式系统的用户界面。它基于C++语言,但提供了丰富的API和类库,使得开发者能够轻松地构建功能丰富的图形用户界面。QT5...

    Qt5开发及实例第三版源码

    在"Qt5开发及实例(第3版)源程序"中,每个子文件夹可能对应书中的一章或一个主题,每个文件通常是一个独立的示例,包含对应的C++和QML源代码。读者可以通过编译和运行这些代码,亲自动手实践,以加深对Qt5编程的理解...

    Qt5开发及实例源代码

    信号与槽机制是Qt中的一个重要特性,它允许对象间进行通信,当某个事件发生时,发送信号的对象可以触发接收信号的对象执行相应的槽函数。 在源代码中,你可能会看到使用`QApplication`作为程序入口,它是整个应用的...

    Qt5开发及实例 第3版 陆文周

    Qt5是Qt库的一个重要版本,由The Qt Company维护,它是一个广泛使用的开源C++图形用户界面应用程序开发框架。Qt5提供了丰富的API,支持多种操作系统,包括Windows、Linux、macOS、Android以及iOS等。本书第三版的...

    QT摄像头界面编程实例

    QT摄像头界面编程实例是针对初学者的一个优秀项目,旨在帮助开发者了解如何在QT环境中集成摄像头功能并创建用户界面。QT框架是一种广泛使用的跨平台应用程序开发工具,尤其适用于GUI(图形用户界面)设计。通过QT,...

    qt 应用程序实例包括开发的qt各个方面

    总的来说,这个QT应用程序实例集合是一个全面的学习资源,它涵盖了QT开发的各个层面,从基础的UI设计到复杂的网络通信,从源码组织到性能优化。无论你是初次接触QT,还是希望提升现有技能,这些实例都将提供宝贵的...

    QT5开发及实例(第三版)代码文件(全部可运行

    本资源为"QT5开发及实例(第三版)代码文件(全部可运行)",提供了书中18个章节的实践代码示例,旨在帮助开发者深入理解和应用QT5进行软件开发。 1. **QT5基础** - **安装与配置**:在不同操作系统(如Windows、...

Global site tag (gtag.js) - Google Analytics