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物件的記憶體。但是如果靜態記憶體釋放的時候會崩潰,因為靜態的變數儲存於靜態區,程式無法釋放,如果強制釋放的時候就會崩潰。舉個例子,比如,我們的程...