QT只运行一个实例
目前使QT運(yùn)行一個(gè)實(shí)例有三種方式:
1.QSharedMemory
使用共享內(nèi)存,當(dāng)?shù)诙€(gè)進(jìn)程啟動(dòng)時(shí),判斷內(nèi)存區(qū)數(shù)據(jù)是否建立,如有。則退出;這種方式有弊端,在程序發(fā)生崩潰時(shí),未及時(shí)清除共享區(qū)數(shù)據(jù),導(dǎo)致程序不能正常啟動(dòng)。
2. QtSingleApplication
使用QT擴(kuò)展庫(kù)QtSingleApplication,能很好的解決這個(gè)問(wèn)題。里面就是用的QLocalServer/QLocalSocket建立本地socket來(lái)判斷實(shí)例是否存在
3. 利用QLocalServer實(shí)現(xiàn)
代碼如下:
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(); 此代碼是用來(lái)退出事件循環(huán)的;在構(gòu)造函數(shù)中,事件循環(huán) 34 *尚未啟動(dòng),因此就無(wú)法退出. 最好就是設(shè)置標(biāo)志判斷在外部判斷 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 //防止程序崩潰時(shí),殘留進(jìn)程服務(wù),移除之 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 //顯示傳入?yún)?shù)值 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服務(wù)。
?
?
http://tcspecial.iteye.com/blog/1622353
?
轉(zhuǎn)載于:https://www.cnblogs.com/georgeOfChina/p/7826877.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: Ubuntu上安装flashplayer
- 下一篇: 关于定位的一些知识: