自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓Qt應用程序只有一個實例

移動開發(fā)
Qt開放源代碼,并且提供自由軟件的用戶協(xié)議。使得它可以被廣泛地應用在各平臺上的開放源代碼軟件開發(fā)中QLocalSocket 提供了一個本地的套接字

在實際應用中,我們經(jīng)常需要讓應用程序只有一個實例,再打開新的文檔或者頁面時,只是替換現(xiàn)在的窗口或者新打開一個標簽,而不是重新啟動一次應用程序。Qt中是否可以做到這樣呢,答案是肯定的,因為Qt本身可以直接調(diào)用系統(tǒng)API,肯定可以做到,但是我們希望找到一個跨平臺的通用的解決方案。

這就要用到Qt的QLocalSocket,QLocalServer類了,這兩個類從接口上看和網(wǎng)絡通信socket沒有區(qū)別,但是它并不是真正的網(wǎng)絡API,只是模仿了而已。這兩個類在Unix/Linux系統(tǒng)上采用Unix域socket實現(xiàn),而在Windows上則采用有名管道(named pipe)來實現(xiàn)。

既然是網(wǎng)絡API,那么思路就很簡單了,應用程序啟動時首先會去連一個服務器(這里通過應用程序的名字來標識,就像網(wǎng)絡端口一樣),如果連接失敗,那么則自己是第一個實例,就創(chuàng)建這么一個服務器,否則將啟動參數(shù)發(fā)送到服務器,然后自動退出,而服務器會在收到通知以后進行處理。

這些動作我想最好是放在創(chuàng)建Application實例后,因為Qt本身有很多操作沒有Application實例是無法進行操作的(至少事件循環(huán)是在創(chuàng)立Application以后才能啟動吧),因此最好的位置就是通過繼承QApplicaiton或者QCoreApplication自定義一個YourOwnApplication,然后在構(gòu)造函數(shù)中進行,下面是一個示意。

首先是YourOwnApplication構(gòu)造函數(shù):

 

  1. QString serverName = QCoreApplication::applicationName();  
  2.     QLocalSocket socket;  
  3.     socket.connectToServer(serverName);  
  4.     if (socket.waitForConnected(500)) { //如果能夠連接得上的話,將參數(shù)發(fā)送到服務器,然后退出  
  5.         QTextStream stream(&socket);  
  6.         QStringList args = QCoreApplication::arguments();  
  7.         if (args.count() > 1)  
  8.             stream << args.last();  
  9.         else  
  10.             stream << QString();  
  11.         stream.flush();  
  12.         socket.waitForBytesWritten();  
  13. qApp->quit();  
  14.         return;  
  15. }  
  16. //運行到這里,說明沒有實例在運行,那么創(chuàng)建服務器。  
  17.     m_localServer = new QLocalServer(this);  
  18.     connect(m_localServer, SIGNAL(newConnection()),  
  19.             this, SLOT(newLocalSocketConnection())); //監(jiān)聽新到來的連接  
  20.     if (!m_localServer->listen(serverName)) {  
  21.         if (m_localServer->serverError() == QAbstractSocket::AddressInUseError  
  22.            && QFile::exists(m_localServer->serverName())) { //確保能夠監(jiān)聽成功  
  23.             QFile::remove(m_localServer->serverName());  
  24.             m_localServer->listen(serverName);  
  25.         }  
  26.     } 

這樣就保證了新啟動的程序在檢測到有其他實例在運行時就會自動退出,但是它發(fā)出的請求還沒有被處理,下面看一下處理函數(shù),也就是前段代碼中的newLocalSocketConnection()。

  1. QLocalSocket *socket = m_localServer->nextPendingConnection();  
  2.     if (!socket)  
  3.         return;  
  4.     socket->waitForReadyRead(1000);  
  5.     QTextStream stream(socket);  
  6.    … … //其他處理  
  7.     delete socket;  
  8.     mainWindow()->raise();  
  9.     mainWindow()->activateWindow(); //記得激活窗口哦 

【編輯推薦】

 Qt Symbian SDK 安裝

用Qt為Symbian開發(fā)應用程序

諾基亞發(fā)布Qt SDK 1.1正式版

詳解Qt Lighthouse和Wayland

QML教程:Qt-Quick六大開源組件

Qt和KDE在未來將面臨新的挑戰(zhàn)和機遇

責任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-05-11 10:58:39

iOS

2011-01-20 07:16:48

Web程序員

2011-08-10 17:24:05

SQL語句嵌入式SQLJava

2011-06-09 09:12:12

QT symbian

2023-05-19 08:49:58

SQLAlchemy數(shù)據(jù)庫

2010-08-13 13:05:30

Flex應用程序

2013-01-11 14:45:43

iOS開發(fā)移動應用iPhone

2020-10-11 20:54:39

Python開發(fā)Docker

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2011-03-15 19:45:27

Windows Azu

2009-10-19 14:14:19

OSGi Web應用

2012-12-07 10:15:53

IBMdW

2011-06-08 10:01:36

Windows Pho 應用程序

2013-05-13 09:31:29

Web App開發(fā)WebApp

2022-10-21 14:21:46

JavaScript筆記技能

2011-06-08 10:24:38

Windows Pho 應用程序

2011-03-10 10:45:47

Azure“Hello Worl

2011-06-14 14:57:06

QT Python GUI

2011-05-03 09:14:45

QtOvi商店Symbian
點贊
收藏

51CTO技術(shù)棧公眾號