只运行一个程序实例

在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的实现,可跨平台:

QString serverName = QCoreApplication::applicationName(); QLocalSocket socket; socket.connectToServer(serverName); if (socket.waitForConnected(500)) { //如果能够连接得上的话,将参数发送到服务器,然后退出 QTextStream stream(&socket); QStringList args = QCoreApplication::arguments(); if (args.count() > 1) stream << args.last(); else stream << QString(); stream.flush(); socket.waitForBytesWritten(); qApp->quit(); return; } //运行到这里,说明没有实例在运行,那么创建服务器。 m_localServer = new QLocalServer(this); connect(m_localServer, SIGNAL(newConnection()), this, SLOT(newLocalSocketConnection())); //监听新到来的连接 if (!m_localServer->listen(serverName)) { if (m_localServer->serverError() == QAbstractSocket::AddressInUseError && QFile::exists(m_localServer->serverName())) { //确保能够监听成功 QFile::remove(m_localServer->serverName()); m_localServer->listen(serverName); } } // 这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出, // 但是它发出的请求还没有被处理, // 下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。 QLocalSocket *socket = m_localServer->nextPendingConnection(); if (!socket) return; socket->waitForReadyRead(1000); QTextStream stream(socket); //其他处理 delete socket; mainWindow()->raise(); mainWindow()->activateWindow(); //记得激活窗口哦

 

参考自:http://www.cppblog.com/stevenyao/archive/2009/12/19/103545.html

http://www.oschina.net/code/snippet_54100_629

你可能感兴趣的:(只运行一个程序实例)