此代码在Windows和Mac OS X测试可以正常使用,只能运行一个进程。
但是在Linux下就会出现异常。
代码:
main.cpp
#include "login.h" #include "qsingleapplication.h" #include#include #include 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 #includeclass 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#include #include #include 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() () from5.6/gcc_64/lib/libQt5Core.so.5 #2 0x00007fffed8c1a6f in ?? () from 5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #3 0x00007fffed8c1f3e in QXcbIntegration::wmClass() const () from 5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #4 0x00007fffed8d49eb in QXcbWindow::create() () from 5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #5 0x00007fffed8c1831 in QXcbIntegration::createPlatformWindow(QWindow*) const () from 5.6/gcc_64/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #6 0x00007ffff65f6b6d in QWindowPrivate::create(bool) () from 5.6/gcc_64/lib/libQt5Gui.so.5 #7 0x00007ffff6e77dbf in QWidgetPrivate::create_sys(unsigned long long, bool, bool) () from 5.6/gcc_64/lib/libQt5Widgets.so.5 #8 0x00007ffff6e772c9 in QWidget::create(unsigned long long, bool, bool) () from 5.6/gcc_64/lib/libQt5Widgets.so.5 #9 0x00007ffff6e82f32 in QWidget::setVisible(bool) () ---Type to continue, or q to quit--- from 5.6/gcc_64/lib/libQt5Widgets.so.5 #10 0x00007ffff702f893 in QDialog::setVisible(bool) () from 5.6/gcc_64/lib/libQt5Widgets.so.5 #11 0x00000000004118ed in main ()
Google搜索无果。