Qt:让程序实现单例模式,只能打开一次
2016-05-22 17:35
721 查看
介绍
让程序实现单例模式,只能打开一次,这已经是一个老生常谈的问题了。方法也有很多,比如说监听端口,文件锁。我这里介绍一个用共享内存的方法。
先上代码
代码部分
代码部分(.h文件):namespace JQFoundation { bool singleApplication(const QString &flag); bool singleApplicationExist(const QString &flag); }
代码部分(.cpp文件):
#if !(defined Q_OS_IOS) && !(defined Q_OS_ANDROID) && !(defined Q_OS_WINPHONE) bool JQFoundation::singleApplication(const QString &flag) { static QSharedMemory *shareMem = nullptr; if (shareMem) { return true; } shareMem = new QSharedMemory( "JQFoundationSingleApplication_" + flag ); for ( auto count = 0; count < 2; ++count ) { if (shareMem->attach( QSharedMemory::ReadOnly )) { shareMem->detach(); } } if ( shareMem->create( 1 ) ) { return true; } return false; } #else bool JQFoundation::singleApplication(const QString &) { return true; } #endif #if !(defined Q_OS_IOS) && !(defined Q_OS_ANDROID) && !(defined Q_OS_WINPHONE) bool JQFoundation::singleApplicationExist(const QString &flag) { QSharedMemory shareMem( "JQFoundationSingleApplication_" + flag ); for ( auto count = 0; count < 2; ++count ) { if (shareMem.attach( QSharedMemory::ReadOnly )) { shareMem.detach(); } } if ( shareMem.create( 1 ) ) { return false; } return true; } #else bool JQFoundation::singleApplicationExist(const QString &) { return false; } #endif
接口
只有两个接口,使用都很简单,传入的参数就是一个标记字符串singleApplication
检查单例模式,并且上锁。返回true表示上锁成功,false表示失败。
singleApplicationExist
检查单例模式,但不上锁。返回true表示已经有锁,false表示无锁。
使用
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); if ( !JQFoundation::singleApplication( "myApplication" ) ) { qDebug() << "Application already running"; return -1; } return a.exec(); }
注意
在移动平台上,共享内存不一定是可靠的,所以在移动平台上就用条件编译跳过了,毕竟移动平台上一般程序都已经是单例模式了。相关文章推荐
- Qt学习笔记之数据库的访问
- 在Qt中使用ActiveX控件
- Qt学习笔记之数据库的连接
- Homebrew 1.0.0 发布,MacOS 上的包管理器,比如安装qt5keychain
- QT中实现定时器
- QtCreator调试环境搭建
- Qt exec()做了什么
- Qtcreator 调试cmake
- Qt 访问网络的 HttpClient(封装QNetworkAccessManager,且有服务端)
- qt各版本下载地址
- 深度解析Qt中动态链接库
- qt实现二维码生成
- qt下操作串口
- qt下使用sqlite数据库存储二进制文件
- qt导入导出excel和csv
- Qt 应用程序的部署
- Qt 的信号与槽
- Qt Creater 常用知识汇总
- QtQml 应用程序的性能考虑与建议
- Qt 文件逐字节的读取与写入的补充