很有時候需要只能運行一個程序實例,運行多個會出問題,比如金山詞霸,運行兩個的話一起屏幕取詞就亂套了,搞不好系統都會崩潰。
在Windows下,通常是用 一個命名互斥體來達到這個目的,創建一個 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
在一個實例運行前,先試圖去連接這個服務,如果無法連接,就去創建一個,這樣總是第一個實例創建服務,第二個實例連接服務。
當第二實例,連接后,還可以通過這個服務給第一實例發送消息,比如文件關聯的程序,可以把命令行參數傳遞給第一實例,用第一實例打開文件。
這里有個經典的實現,使用了QLocalServer, 用QSharedMemory來共享數據
http://wiki.qtcentre.org/index.php?title=SingleApplication
另一個參考實現是 qt creator 代碼里的
http://qt.gitorious.org/qt-creator/qt-creator/blobs/903457ee6954e40ff41aa01e19e8f6ccbb5c8384/src/shared/qtsingleapplication/qtsingleapplication.cpp