首页 > Qt QSingleApplication(一次只能运行一个实例)在Linux下出现异常

Qt QSingleApplication(一次只能运行一个实例)在Linux下出现异常

此代码在Windows和Mac OS X测试可以正常使用,只能运行一个进程。
但是在Linux下就会出现异常。

代码:
main.cpp

#include "login.h"
#include "qsingleapplication.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QTranslator>

int main(int argc, char *argv[])
{
    //仅允许一个实例运行(官方版百度云管家也是如此)
    QSingleApplication app(argc, argv);
    app.setApplicationDisplayName("BCND");
    if (app.isRunning())
    {
        app.activeWindow();
        return 0;
    }
    //其他代码
    login login;
    login.show();
    return app.exec();
}

qsingleapplication.h

#ifndef SINGLE_APPLICATION_H
#define SINGLE_APPLICATION_H

#include <QApplication>

class QLocalServer;

class QSingleApplication : public QApplication
{
    Q_OBJECT

public:
    QSingleApplication(int argc, char **argv);
    // 判断进程是否存在
    bool isRunning();

private slots:
    void newLocalConnection();

private:
    QLocalServer *pServer;
    bool bRunning;
};

#endif // SINGLE_APPLICATION_H

qsingleapplication.cpp

#include "qsingleapplication.h"
#include <QLocalSocket>
#include <QLocalServer>
#include <QFile>
#include <QTextStream>

QSingleApplication::QSingleApplication(int argc, char **argv)
    : QApplication(argc, argv),
      bRunning(false)
{
    QCoreApplication::setApplicationName("BCND");
    QCoreApplication::setApplicationVersion(VERSION_STRING);
    QCoreApplication::setOrganizationName("iVanilla");
    QCoreApplication::setOrganizationDomain("https://github.com/iVanilla/BCND");
    QString strServerName = QCoreApplication::organizationName() + QCoreApplication::applicationName();

    QLocalSocket socket;
    socket.connectToServer(strServerName);

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

        QString strArg = (args.count() > 1) ? args.last() : "";
        stream << strArg;
        stream.flush();
        qDebug() << "Have already connected to server.";

        socket.waitForBytesWritten();

        bRunning = true;
    }
    else
    {
        // 如果不能连接到服务器,则创建一个
        pServer = new QLocalServer(this);
        connect(pServer, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));

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

void QSingleApplication::newLocalConnection()
{
    QLocalSocket *pSocket = pServer->nextPendingConnection();
    if (pSocket != NULL)
    {
        pSocket->waitForReadyRead(1000);

        QTextStream in(pSocket);
        QString strValue;
        in >> strValue;
        qDebug() << QString("The value is: %1").arg(strValue);

        delete pSocket;
        pSocket = NULL;
    }
}

bool QSingleApplication::isRunning()
{
    return bRunning;
}

完整项目地址:https://github.com/iVanilla/BCND/tree/dev

使用gdb调试的结果是:

../sysdeps/x86_64/strlen.s no such file or directory

gbd bt输出:

(gdb) bt
#0  strlen () at ../sysdeps/x86_64/strlen.S:106
#1  0x00007ffff5aadcad in QCoreApplication::arguments() ()
   from <QTDIR>5.6/gcc_64/lib/libQt5Core.so.5
#2  0x00007fffed8c1a6f in ?? ()
   from <QTDIR>5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5
#3  0x00007fffed8c1f3e in QXcbIntegration::wmClass() const ()
   from <QTDIR>5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5
#4  0x00007fffed8d49eb in QXcbWindow::create() ()
   from <QTDIR>5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5
#5  0x00007fffed8c1831 in QXcbIntegration::createPlatformWindow(QWindow*) const
    ()
   from <QTDIR>5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5
#6  0x00007ffff65f6b6d in QWindowPrivate::create(bool) ()
   from <QTDIR>5.6/gcc_64/lib/libQt5Gui.so.5
#7  0x00007ffff6e77dbf in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from <QTDIR>5.6/gcc_64/lib/libQt5Widgets.so.5
#8  0x00007ffff6e772c9 in QWidget::create(unsigned long long, bool, bool) ()
   from <QTDIR>5.6/gcc_64/lib/libQt5Widgets.so.5
#9  0x00007ffff6e82f32 in QWidget::setVisible(bool) ()
---Type <return> to continue, or q <return> to quit---
   from <QTDIR>5.6/gcc_64/lib/libQt5Widgets.so.5
#10 0x00007ffff702f893 in QDialog::setVisible(bool) ()
   from <QTDIR>5.6/gcc_64/lib/libQt5Widgets.so.5
#11 0x00000000004118ed in main ()

Google搜索无果。

【热门文章】
【热门文章】