Qt: 한 번만 열 수 있는 단일 모드 프로그램

4802 단어 Qt

소개하다.


프로그램이 단일 모드를 실현하도록 하는 것은 단지 한 번만 열 수 있다는 것은 이미 흔히 말하는 문제이다.
감청 포트, 파일 자물쇠 같은 방법도 많다.여기에 메모리를 공유하는 방법을 소개합니다.
선상 부호

코드 섹션


4
  • 코드 섹션(.h 파일):
  • namespace JQFoundation
    {
    
    bool singleApplication(const QString &flag);
    
    bool singleApplicationExist(const QString &flag);
    
    }

    4
  • 코드 섹션(.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();
    }

    주의


    모바일 플랫폼에서 공유 메모리가 반드시 신뢰할 수 있는 것은 아니기 때문에 모바일 플랫폼에서 조건으로 컴파일한 적이 있다. 왜냐하면 모바일 플랫폼에서 일반적인 프로그램은 이미 단일 모델이기 때문이다.

    좋은 웹페이지 즐겨찾기