Qt: 한 번만 열 수 있는 단일 모드 프로그램
4802 단어 Qt
소개하다.
프로그램이 단일 모드를 실현하도록 하는 것은 단지 한 번만 열 수 있다는 것은 이미 흔히 말하는 문제이다.
감청 포트, 파일 자물쇠 같은 방법도 많다.여기에 메모리를 공유하는 방법을 소개합니다.
선상 부호
코드 섹션
4
namespace JQFoundation
{
bool singleApplication(const QString &flag);
bool singleApplicationExist(const QString &flag);
}
4
#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
이음매
두 개의 인터페이스만 있고 사용은 매우 간단하며, 전송된 매개 변수는 하나의 표기 문자열이다
단일 모드를 검사하고 자물쇠를 잠그십시오.true로 돌아가면 잠금이 성공했고false는 실패를 표시합니다.
단일 모드를 검사하지만 자물쇠가 잠기지 않습니다.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();
}
주의
모바일 플랫폼에서 공유 메모리가 반드시 신뢰할 수 있는 것은 아니기 때문에 모바일 플랫폼에서 조건으로 컴파일한 적이 있다. 왜냐하면 모바일 플랫폼에서 일반적인 프로그램은 이미 단일 모델이기 때문이다.