很有時候需要只能運行一個程序?qū)嵗\行多個會出問題,比如金山詞霸,運行兩個的話一起屏幕取詞就亂套了,搞不好系統(tǒng)都會崩潰。
在Windows下,通常是用 一個命名互斥體來達到這個目的,創(chuàng)建一個 Mutex
代碼如下:
bool IsPreInstanceRunning()
{
HANDLE hMutex = CreateMutex(NULL, TRUE, _T("My app instance"));
if(hMutex == NULL || GetLastError() == ERROR_ALREADY_EXISTS)
{
return true;
}
return false;
}
但是在 Qt下,需要一個跨平臺的方法,這個方法是 QLocalServer
在一個實例運行前,先試圖去連接這個服務(wù),如果無法連接,就去創(chuàng)建一個,這樣總是第一個實例創(chuàng)建服務(wù),第二個實例連接服務(wù)。
當(dāng)?shù)诙嵗B接后,還可以通過這個服務(wù)給第一實例發(fā)送消息,比如文件關(guān)聯(lián)的程序,可以把命令行參數(shù)傳遞給第一實例,用第一實例打開文件。
這里有個經(jīng)典的實現(xiàn),使用了QLocalServer, 用QSharedMemory來共享數(shù)據(jù)
http://wiki.qtcentre.org/index.php?title=SingleApplication
另一個參考實現(xiàn)是 qt creator 代碼里的
http://qt.gitorious.org/qt-creator/qt-creator/blobs/903457ee6954e40ff41aa01e19e8f6ccbb5c8384/src/shared/qtsingleapplication/qtsingleapplication.cpp