在Windows下,通常是用 一個命名互斥體來達到這個目的,建立一個 Mutex
代碼如下:
bool IsPreInstanceRunning()<br />{<br /> HANDLE hMutex = CreateMutex(NULL, TRUE, _T("My app instance"));<br /> if(hMutex == NULL || GetLastError() == ERROR_ALREADY_EXISTS)<br /> {<br /> return true;<br /> }<br /> return false;<br />}
QT的實現,可跨平台:
QString serverName = QCoreApplication::applicationName();</p><p>QLocalSocket socket;<br />socket.connectToServer(serverName);</p><p>if (socket.waitForConnected(500)) { //如果能夠串連得上的話,將參數發送到伺服器,然後退出</p><p> QTextStream stream(&socket);<br /> QStringList args = QCoreApplication::arguments();</p><p> if (args.count() > 1)<br /> stream << args.last();<br /> else<br /> stream << QString();<br /> stream.flush();<br /> socket.waitForBytesWritten();<br /> qApp->quit();</p><p> return;<br />}</p><p>//運行到這裡,說明沒有執行個體在運行,那麼建立伺服器。</p><p>m_localServer = new QLocalServer(this);</p><p>connect(m_localServer, SIGNAL(newConnection()),<br /> this, SLOT(newLocalSocketConnection())); //監聽新到來的串連</p><p>if (!m_localServer->listen(serverName)) {<br /> if (m_localServer->serverError() == QAbstractSocket::AddressInUseError<br /> && QFile::exists(m_localServer->serverName())) { //確保能夠監聽成功<br /> QFile::remove(m_localServer->serverName());<br /> m_localServer->listen(serverName);<br /> }<br />}<br />// 這樣就保證了新啟動的程式在檢測到有其他執行個體在運行時就會自動結束,<br />// 但是它發出的請求還沒有被處理,<br />// 下面看一下處理函數,也就是前段代碼中的newLocalSocketConnection()。</p><p>QLocalSocket *socket = m_localServer->nextPendingConnection();</p><p>if (!socket)<br /> return;</p><p>socket->waitForReadyRead(1000);<br />QTextStream stream(socket);<br />//其他處理</p><p>delete socket;<br />mainWindow()->raise();<br />mainWindow()->activateWindow(); //記得啟用視窗哦
參考自:http://www.cppblog.com/stevenyao/archive/2009/12/19/103545.html
http://www.oschina.net/code/snippet_54100_629