很有时候需要只能运行一个程序实例,运行多个会出问题,比如金山词霸,运行两个的话一起屏幕取词就乱套了,搞不好系统都会崩溃。
在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