stevenyao

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 1 文章 :: 67 评论 :: 0 Trackbacks
很有时候需要只能运行一个程序实例,运行多个会出问题,比如金山词霸,运行两个的话一起屏幕取词就乱套了,搞不好系统都会崩溃。 在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
posted on 2009-12-19 22:38 姚冬 阅读(2389) 评论(1)  编辑 收藏 引用

评论

# re: 让程序只运行一个实例的最佳方法 2009-12-21 09:42 guest
在CPPBLOG上看了很多这类写法,都是潜在一个BUG,在多用户登陆下,这种方法就会失效,应该把对象放在Global目录下,这样该对象才会共享。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理