欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > Qt只启动一个exe的QSingleApplication

Qt只启动一个exe的QSingleApplication

2025/11/10 21:17:50 来源:https://blog.csdn.net/yxmlhc/article/details/148706209  浏览:    关键词:Qt只启动一个exe的QSingleApplication

有些项目只允许启动一个exe,因此需要处理一下,Qt自己给了一个QSingleApplication的例子

使用QLocalServer创建一个服务,然后每次启动时,判断是否已经有连接上,具体代码如下

#ifndef SINGLE_APPLICATION_H
#define SINGLE_APPLICATION_H#include <QApplication>class QLocalServer;class QSingleApplication : public QApplication
{Q_OBJECTpublic:QSingleApplication(int argc, char **argv);// 判断进程是否存在bool isRunning();private slots:void newLocalConnection();private:QLocalServer *pServer;bool bRunning;
};#endif // SINGLE_APPLICATION_H
#include "qsingleapplication.h"
#include <QLocalSocket>
#include <QLocalServer>
#include <QFile>
#include <QTextStream>QSingleApplication::QSingleApplication(int argc, char **argv): QApplication(argc, argv),bRunning(false)
{QCoreApplication::setApplicationName("BPaaa");QCoreApplication::setApplicationVersion("VERSION_STRING");QCoreApplication::setOrganizationName("BPabc");QCoreApplication::setOrganizationDomain("https://github.com");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 != nullptr){pSocket->waitForReadyRead(1000);QTextStream in(pSocket);QString strValue;in >> strValue;qDebug() << QString("The value is: %1").arg(strValue);delete pSocket;pSocket = nullptr;}
}bool QSingleApplication::isRunning()
{return bRunning;
}

使用方式如下

int main(int argc, char *argv[])
{
//    QApplication a(argc, argv);   //替换掉这一句QSingleApplication a(argc, argv);if(a.isRunning()){return 0;}
......
......return a.exec();
}

也有用QShareMemory处理的,在main.cpp中加入如下语句。

    QSystemSemaphore sema("AA",1, QSystemSemaphore::Open);sema.acquire();// 在临界区操作共享内存   SharedMemoryQSharedMemory mem("AAAAA");// 全局对象名if (!mem.create(1))// 如果全局对象已存在则退出{sema.release(); // 如果是 Unix 系统,会自动释放。return 0;}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词