Qt4.8单实例启动的一种方法

来源:互联网 发布:松江3208g编程类型代码 编辑:程序博客网 时间:2024/05/18 12:34

原理是使用Qt的QLocalServer和QLocalSocket类创建一个虚拟服务端(因为不是真实的socket,所以称之为虚拟)。

程序启动时检测同名服务端是否启动,如果服务端已经启动,则退出,否则创建一个服务端并继续启动。

代码如下:

头文件:

#include <QApplication>class QLocalServer;class YxsSingleApplication : public QApplication{    Q_OBJECTpublic:    YxsSingleApplication(int &argc, char **argv);    ~YxsSingleApplication();    bool isRunning();public slots:    void slotNewConnection();private:    void initConnection();    void createServer();    void setWindowActivated();private:    QWidget *m_widget;    QLocalServer *m_server;    QString m_server_name;    bool m_isRunning;};


源文件:
YxsSingleApplication::YxsSingleApplication(int &argc, char **argv) :    QApplication(argc, argv),    m_widget(0),    m_server(0),    m_server_name(""),    m_isRunning(false){    m_server_name = QFileInfo(QCoreApplication::applicationFilePath()).fileName();    initConnection();}YxsSingleApplication::~YxsSingleApplication(){}bool YxsSingleApplication::isRunning(){    return m_isRunning;}void YxsSingleApplication::slotNewConnection(){    QLocalSocket *socket = m_server->nextPendingConnection();    if (socket)    {        socket->waitForReadyRead(1000);        delete socket;        setWindowActivated();    }}void YxsSingleApplication::initConnection(){    QLocalSocket socket;    // 连接以应用程序名称为server name的server    // 如果连接不上则代表未启动,此时创建一个新的server    m_isRunning = false;    socket.connectToServer(m_server_name);    if (socket.waitForConnected(500))    {        m_isRunning = true;        return;    }    createServer();}void YxsSingleApplication::createServer(){    m_server = new QLocalServer(this);    connect(m_server, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));    if (!m_server->listen(m_server_name))    {        // 此时监听失败,可能是程序崩溃是残留进程的服务所导致,移除        if (QAbstractSocket::AddressInUseError == m_server->serverError())        {            QLocalServer::removeServer(m_server_name);            m_server->listen(m_server_name);        }    }}void YxsSingleApplication::setWindowActivated(){    if (m_widget)    {        m_widget->show();        m_widget->raise();        m_widget->activateWindow();    }}

使用方式:

int main(int argc, char *argv[]){    YxsSingleApplication app(argc, argv);    if (!app.isRunning())    {        YxsMainWindow win;        win.show();        return app.exec();    }    return 0;}


0 0
原创粉丝点击