[QT编程]QT中实现应用程序的单例化

最近想实现一个应用程序单例化的程序,在http://www.qtcentre.org/wiki/index.php?title=SingleApplication看到可以通过编写一个SingleApplication类来实现。

 

它提供了两个SingleApplication类,第一个用QSharedMemory, QLocalServer 和 QLocalSocket实现,第二个用QSharedMemory和QTimer实现,具体代码网页说明得很清楚,怎么使用也有代码示例。我自己也将代码做了测试,第二个类被我改成SingleApplication2。

 

编译之后,运行。找到编译出来的文件,再运行一次就可以看到效果了。两个SingleApplication类都用了Qt的共享内存,不同之处在于程序实例之间的通信(也就是程序第二个实例通知程序的第一个实例用户又一次运行了本程序,此时第一个实例可以做出相应的相应)用的方式不同。

 

如果两个程序实例之间直接不需要通信,那么直接使用共享内存实现就可以了,不需要QLocalServer 和 QLocalSocket或者QTimer。

 

下面是我自己写的一个只使用共享内存实现SingleApplication的类

//MySingleApplication.h

#ifndef MYSINGLEAPPLICATION_H

#define MYSINGLEAPPLICATION_H

#include <QtGui/QApplication>

#include <QtCore/QSharedMemory>

class MySingleApplication : public QApplication

{

    Q_OBJECT

public:

    MySingleApplication(int &argc, char *argv[], const QString uniqueKey);

    bool isRunning();

private:

    bool _isRunning;

    QString _uniqueKey;

    QSharedMemory sharedMemory;

};

#endif // MYSINGLEAPPLIACTION_H

 

//MySingleApplication.cpp

#include "MySingleApplication.h"

MySingleApplication::MySingleApplication(int &argc, char *argv[], const QString uniqueKey) :

    QApplication(argc, argv), _uniqueKey(uniqueKey)

{

    sharedMemory.setKey(_uniqueKey);

    if (sharedMemory.attach())

        _isRunning = true;

    else

    {

        _isRunning = false;

        // create shared memory.

        if (!sharedMemory.create(1))

        {

            qDebug("Unable to create single instance.");

            return;

        }

    }

}

bool MySingleApplication::isRunning()

{

    return _isRunning;

}

 

下面是测试用的主函数

#include "MySingleApplication.h"

#include "MainWindow.h"

#include <QtGui/QMessageBox>

int main(int argc, char *argv[])

{

    SingleApplication app(argc, argv, "some unique key string");

    if (app.isRunning())

    {

        QMessageBox::information(0, "message", "Appliction is runing");

        return 0;

    }

    MainWindow *mainWindow = new MainWindow();

    mainWindow->show();

    return app.exec();

}

同样的,运行两次可以看到结果。

 

附件:

源码SingleApplication.zip

下载地址:

http://pan.baidu.com/share/link?shareid=135850&uk=3238766853

posted @ 2012-07-16 21:06  喵星人の耳朵  阅读(1505)  评论(0编辑  收藏  举报