实现应用程序单实例的三个方法
- 共享内存(QSharedMemory);
- QLocalServer;
- QtSingleApplication。
共享内存
原理
创建同一块Key的共享内存,在有多个应用程序时,可以在无需create
的情况下attach
,以此判断是否有多个应用程序实例。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <QCoreApplication> #include <QSharedMemory> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSharedMemory sharedMemory("testForSharedMemory"); if(sharedMemory.attach()) return 0; sharedMemory.create(1); MainWindow w; w.show(); return a.exec(); }
|
使用注意
在Unix
操作系统中,如果最后一个线程或进程在没有运行~QSharedMemory()
的情况下崩溃,共享内存段会在崩溃时幸存下来。
QLocalServer
原理
QLocalServer
提供一个基于本地socket
的server
,可以通过设置对应key
连接对应Server,以判断唯一实例。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <QLocalServer> #include <QLocalSocket> #include <QString> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString serverName = "localServer"; QLocalSocket socket; socket.connectToServer(serverName); if(socket.waitForConnected(1000)) return 0; QLocalServer server; if (server.listen(serverName)) { if(server.serverError()== QAbstractSocket::AddressInUseError) { QLocalServer::removeServer(serverName); server.listen(serverName); } }
|
QtSingleApplication
来源
Qt
官方提供的Qt-Solutions
中的项目,长期维护中。
原理
有关QtSingleApplication
详情见此处
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <qtsingleapplication.h> int main(int argc, char** argv) { const QString APP_ID("app id"); QtSingleApplicion app(APP_ID, argc, argv); if(app.isRunning()) { return 0; } MainWindow w; w.show(); return app.exec(); }
|