QT只運行一個實例


目前使QT運行一個實例有三種方式:

1.QSharedMemory

  使用共享內存,當第二個進程啟動時,判斷內存區數據是否建立,如有。則退出;這種方式有弊端,在程序發生崩潰時,未及時清除共享區數據,導致程序不能正常啟動。

2. QtSingleApplication

  使用QT擴展庫QtSingleApplication,能很好的解決這個問題。里面就是用的QLocalServer/QLocalSocket建立本地socket來判斷實例是否存在

3. 利用QLocalServer實現

  代碼如下:

single_application.h

 1 #ifndef SINGLE_APPLICATION_H
 2 #define SINGLE_APPLICATION_H
 3 
 4 #include <QApplication>
 5 #include <QLocalServer>
 6 
 7 class SingleApplication:public QApplication
 8 {
 9     Q_OBJECT
10 public:
11     SingleApplication(int argc,char **argv);
12 
13     bool isRunning();
14 
15 private slots:
16     void newLocalConnection();
17 
18 private:
19     QLocalServer *server;
20 
21     bool _isRunning;
22 };
23 
24 #endif // SINGLE_APPLICATION_H

 

single_application.cpp

 1 #include <QLocalSocket>
 2 #include "single_application.h"
3 4 5 SingleApplication::SingleApplication(int argc, char **argv):QApplication(argc,argv) 6 { 7 _isRunning=false; 8 9 QCoreApplication::setApplicationName("localserver"); 10 QString serverName=QCoreApplication::applicationName(); 11 12 QLocalSocket socket; 13 socket.connectToServer(serverName); 14 15 if(socket.waitForConnected(500)) 16 { 17 QTextStream stream(&socket); 18 QStringList args=QCoreApplication::arguments(); 19 20 if(args.count()>1) 21 { 22 stream<<args.last(); 23 }else 24 { 25 stream<<QString(); 26 } 27 stream.flush(); 28 qDebug()<<"Connected server,program will quit"; 29 30 socket.waitForBytesWritten(); 31 32 /** 33 *qApp->quit(); 此代碼是用來退出事件循環的;在構造函數中,事件循環 34 *尚未啟動,因此就無法退出. 最好就是設置標志判斷在外部判斷 35 */ 36 37 38 _isRunning=true; 39 40 return; 41 } 42 43 qDebug()<<"Can't connect to server,build a server"; 44 server=new QLocalServer(this); 45 connect(server,SIGNAL(newConnection()),this,SLOT(newLocalConnection())); 46 47 if(!server->listen(serverName)) 48 { 49 //防止程序崩潰時,殘留進程服務,移除之 50 if(server->serverError()==QAbstractSocket::AddressInUseError) 51 { 52 QLocalServer::removeServer(serverName);
53 server->listen(serverName); 54 } 55 } 56 57 58 } 59 60 61 void SingleApplication::newLocalConnection() 62 { 63 QLocalSocket *socket=server->nextPendingConnection(); 64 if(!socket) 65 return; 66 67 socket->waitForReadyRead(1000); 68 69 //顯示傳入參數值 70 QTextStream in(socket); 71 QString vl; 72 in>>vl; 73 qDebug()<<"The value is: "<<vl; 74 75 delete socket; 76 } 77 78 79 bool SingleApplication::isRunning() 80 { 81 return _isRunning; 82 }

 

單例化的使用,將SingleApplication代替QApplication類。

main.c

 1 #include "single_application.h"
 2 
 3 int main(int argc, char *argv[])
 4 {
 5  SingleApplication a(argc, argv);
 6     if(a.isRunning())
 7         return 0;
 8 
 9  MainWindow w;
10     w.show();
11 
12     return a.exec();
13 }

注:因 使用QLocalServer的方式,需要在*.pro中添加“QT += network”,才使用LocalServer服務。

 

 

http://tcspecial.iteye.com/blog/1622353

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM