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搜索无果。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论