如何讓Qt應用程式只有乙個例項

2022-03-12 16:17:33 字數 1678 閱讀 7120

在實際應用中,我們經常需要讓應用程式只有乙個例項,再開啟新的文件或者頁面時,只是替換現在的視窗或者新開啟乙個標籤,而不是重新啟動一次應用程式。

qt中是否可以做到這樣呢,答案是肯定的,因為

qt本身可以直接呼叫系統

api,肯定可以做到,但是我們希望找到乙個跨平台的通用的解決方案。

這就要用到qt的

qlocalsocket

,qlocalserver

類了,這兩個類從介面上看和網路通訊

socket

沒有區別,但是它並不是真正的網路

api,只是模仿了而已。這兩個類在

unix/linux

系統上採用

unix

域socket

實現,而在

windows

上則採用有名管道(

named pipe

)來實現。

既然是網路

api,那麼思路就很簡單了,應用程式啟動時首先會去連乙個伺服器(這裡通過應用程式的名字來標識,就像網路埠一樣),如果連線失敗,那麼則自己是第乙個例項,就建立這麼乙個伺服器,否則將啟動引數傳送到伺服器,然後自動退出,而伺服器會在收到通知以後進行處理。

這些動作我想最好是放在建立

例項後,因為

qt本身有很多操作沒有

例項是無法進行操作的(至少事件迴圈是在創立

以後才能啟動吧),因此最好的位置就是通過繼承

或者自定義乙個

,然後在建構函式中進行,下面是乙個示意。

首先是建構函式:

qlocalsocket socket;

socket.connecttoserver(servername);

if (socket.waitforconnected(500))

//執行到這裡,說明沒有例項在執行,那麼建立伺服器。

m_localserver = new qlocalserver(this);

connect(m_localserver, signal(newconnection()),

this, slot(newlocalsocketconnection())); //監聽新到來的連線

if (!m_localserver->listen(servername))

} 這樣就保證了新啟動的程式在檢測到有其他例項在執行時就會自動退出,但是它發出的請求還沒有被處理,下面看一下處理函式,也就是前段**中的

newlocalsocketconnection()。

qlocalsocket

*socket =

m_localserver

->nextpendingconnection();

if(!socket)

return;

socket->waitforreadyread(1000);

qtextstream

stream(socket);

… … //其他處理

deletesocket;

mainwindow()->raise();

mainwindow()->activatewindow(); //記得啟用視窗哦

用C 讓應用程式只有乙個例項在執行

原 很亂,整理了一下 using system using system.runtime.interopservices using system.windows.forms using system.diagnostics using system.reflection public class ...

保證應用程式只有乙個例項在執行

要實現這樣的功能,方法灰常多,利用命名的事件物件,命名的互斥物件都可以實現,下面寫出這兩種方法的實現 1.命名的互斥物件 void main handle hthread1 handle hthread2 建立互斥物件 hmutex createmutex null,true,tickets if ...

乙個應用程式例項

在開發一些應用系統的時候,由於程式內在的一些特徵,系統的某些組成子程式只允許執行乙個應用程式例項,以保證業務和資料處理安全。本文將從實際應用角度來分析其實現原理,對三種實現方式進行測試比較,從而確定一種合適的實現方法。文章的例子使用c 語言進行描述。程序匹配 對於每乙個應用程式執行例項都會包含該例項...