Qt 程式單例執行

2021-09-25 19:54:04 字數 1734 閱讀 9050

git clone git:
// original

int main(int argc, char **ar**)

// single instance

int main(int argc, char **ar**)

在原始檔中發現所有的建構函式就只實現了兩個步驟:

1. 傳遞引數給基類的建構函式

2. 呼叫sysinit()方法

其中sysinit()方法中初始化了成員變數actwin和peer,並建立了peer訊號和本身messagereceived()的訊號槽。其中actwin是activationwindow的縮寫,使用者可以通過setactivationwindow()方法,設定乙個widget,當接收到peer訊號時,就將該widget顯示出來:

/* 系統初始化函式 */

/* 設定啟用視窗,通常設定為主視窗 */

那麼實現單例功能最主要就是peer這個變數了,所以我們接著開啟同目錄下的qtlocalpeer.cpp檔案看看:

/* 只取6個字母字元 */

prefix.remove(qregexp("[^a-za-z]"));

prefix.truncate(6);

qbytearray idc = id.toutf8();

quint16 idnum = qchecksum(idc.constdata(), idc.size());

+ qlatin1char('-') + qstring::number(idnum, 16);

/* 將程序id新增到socketname後面 */

#if defined(q_os_win)

if (!pprocessidtosessionid)

if (pprocessidtosessionid)

#else

socketname += qlatin1char('-') + qstring::number(::getuid(), 16);

#endif

/* 例項化qlocalserver類,並根據socketname建立lock檔案 */

server = new qlocalserver(this);

qstring lockname = qdir(qdir::temppath()).absolutepath()

+ qlatin1char('/') + socketname

+ qlatin1string("-lockfile");

lockfile.setfilename(lockname);

lockfile.open(qiodevice::readwrite);}

1. 單例程式是通過檔案加鎖的方式實現的;

2. 程式之間的通訊,即sendmessage()方法是通過qlocalsocket實現的。

通過原始檔中isclient()方法肯定了這一點:

/* 判斷當前程序是否是qlocaksocket客戶端 */

bool qtlocalpeer::isclient()

#endif

if (!res)

qobject::connect(server, signal(newconnection()), slot(receiveconnection()));

return false;

}

WinForm 程式單例執行

在某些特定的場合下,可能需要程式只執行乙個例項,又稱單例執行。using system.windows.forms using public class program frmmain null 應用程式的主入口點。static void program newprogram public true...

QT應用程式單例項執行

我們經常會做一些軟體 程式只希望有最多乙個執行例項。我從網上找到了個方法,雖然現在還不太明白原理,但是這種方法總算會用了。原文摘自 int main int argc,char argv if sharemem create 1 return 0 當然別忘了在開頭加上 include 這段 應該不用...

qt單例問題

qt有記憶體 機制,如果在qt中單例模式使用的不正確,退出的時候程式可能會崩潰。原因是qt程式在視窗關閉的時候或者程式退出的時候都會銷毀繼承於qobject物件的記憶體。但是如果靜態記憶體釋放的時候會崩潰,因為靜態的變數儲存於靜態區,程式無法釋放,如果強制釋放的時候就會崩潰。舉個例子,比如,我們的程...