Qt:让程序实现单例模式,只能打开一次

介绍

让程序实现单例模式,只能打开一次,这已经是一个老生常谈的问题了。

方法也有很多,比如说监听端口,文件锁。我这里介绍一个用共享内存的方法。

先上代码


代码部分

  • 代码部分(.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();
}

注意

在移动平台上,共享内存不一定是可靠的,所以在移动平台上就用条件编译跳过了,毕竟移动平台上一般程序都已经是单例模式了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值