이는 Qt5
및 Qt6
용 QtSingleApplication을 대체합니다.
애플리케이션의 기본 인스턴스를 유지하고 각 후속 인스턴스를 종료합니다. 활성화된 경우 보조(기본과 관련되지 않은) 인스턴스를 생성할 수 있으며 보조 인스턴스에서 기본 인스턴스로 데이터를 보낼 수 있습니다.
여기에서 전체 사용법 참조 및 예제를 찾을 수 있습니다.
SingleApplication
클래스는 QAPPLICATION_CLASS
매크로( QCoreApplication
이 기본값)를 통해 지정하는 모든 Q[Core|Gui]Application
클래스에서 상속됩니다. 추가 사용법은 Q[Core|Gui]Application
클래스 사용과 유사합니다.
다른 QCoreApplication
파생 클래스를 사용하는 것처럼 라이브러리를 사용할 수 있습니다.
# include < QApplication >
# include < SingleApplication.h >
int main ( int argc, char * argv[] )
{
SingleApplication app ( argc, argv );
return app. exec ();
}
라이브러리 파일을 포함하려면 해당 파일을 프로젝트에 git 하위 모듈로 추가하는 것이 좋습니다. 방법은 다음과 같습니다.
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication
Qmake:
그런 다음 .pro
프로젝트 파일에 singleapplication.pri
파일을 포함합니다.
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplication
CMake:
그런 다음 CMakeLists.txt
프로젝트 파일에 하위 디렉터리를 포함합니다.
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
add_subdirectory (src/third-party/singleapplication)
target_link_libraries ( ${PROJECT_NAME} SingleApplication::SingleApplication)
이 저장소를 Git 하위 모듈로 직접 포함하거나 소스 코드의 얕은 복사본을 새 프로젝트에 포함하는 것은 CMake를 사용할 때 이상적이지 않을 수 있습니다. 또 다른 옵션은 버전 3.11
부터 사용 가능한 CMake의 FetchContent
모듈을 사용하는 것입니다.
# Define the minumun CMake version, as an example 3.24
cmake_minimum_required ( VERSION 3.24)
# Include the module
include (FetchContent)
# If using Qt6, override DEFAULT_MAJOR_VERSION
set (QT_DEFAULT_MAJOR_VERSION 6 CACHE STRING "Qt version to use, defaults to 6" )
# Set QAPPLICATION_CLASS
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
# Declare how is the source going to be obtained
FetchContent_Declare(
SingleApplication
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication
GIT_TAG master
#GIT_TAG e22a6bc235281152b0041ce39d4827b961b66ea6
)
# Fetch the repository and make it available to the build
FetchContent_MakeAvailable(SingleApplication)
# Then simply use find_package as usual
find_package (SingleApplication)
# Finally add it to the target_link_libraries() section
target_link_libraries (ClientePOS PRIVATE
Qt ${QT_VERSION_MAJOR} ::Widgets
Qt ${QT_VERSION_MAJOR} ::Network
Qt ${QT_VERSION_MAJOR} ::Sql
SingleApplication::SingleApplication
)
라이브러리는 QLocalServer
및 QSharedMemory
블록을 설정합니다. 애플리케이션의 첫 번째 인스턴스는 기본 인스턴스입니다. 공유 메모리 블록이 존재하는지 확인하고 그렇지 않은 경우 QLocalServer
를 시작하고 연결을 수신합니다. 애플리케이션의 각 후속 인스턴스는 공유 메모리 블록이 존재하는지 확인하고 존재하는 경우 QLocalServer에 연결하여 새 인스턴스가 시작되었음을 기본 인스턴스에 알리고 그 후 상태 코드 0
으로 종료됩니다. 기본 인스턴스에서 SingleApplication
새 인스턴스가 시작된 것을 감지하면 instanceStarted()
신호를 내보냅니다.
라이브러리는 stdlib
사용하여 exit()
함수로 프로그램을 종료합니다.
또한 위의 예에서처럼 QCoreApplication
이 아닌 경우 앱이 사용하는 QCoreApplication
클래스를 지정하는 것을 잊지 마세요.
SingleApplication
클래스는 instanceStarted()
신호를 구현합니다. 예를 들어, 새 인스턴스가 시작되었을 때 해당 신호에 바인딩하여 애플리케이션 창을 표시할 수 있습니다.
// window is a QWindow instance
QObject::connect (
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
);
SingleApplication::instance()
사용하는 것은 프로그램의 어느 위치에서나 신호에 바인딩하기 위해 SingleApplication
인스턴스를 얻는 깔끔한 방법입니다.
참고: Windows에서는 애플리케이션 창을 전경으로 가져오는 기능이 제한됩니다. 해결 방법 및 예제 구현은 Windows 관련 구현을 참조하세요.
추가 보조 인스턴스(기본 인스턴스와 관련 없음)를 시작하려면 SingleApplication
생성자의 세 번째 매개변수를 사용하여 이를 활성화해야 합니다. 기본값은 보조 인스턴스가 없음을 의미하는 false
입니다. 다음은 보조 인스턴스를 시작하고 기본 인스턴스에 명령줄 인수가 포함된 메시지를 보낸 다음 종료하는 방법에 대한 예입니다.
int main ( int argc, char *argv[])
{
SingleApplication app ( argc, argv, true );
if ( app. isSecondary () ) {
app. sendMessage ( app. arguments (). join ( ' ' )). toUtf8 () );
app. exit ( 0 );
}
return app. exec ();
}
참고: 보조 인스턴스는 기본적으로 instanceStarted()
신호 방출을 유발하지 않습니다. 자세한 내용은 SingleApplication::Mode
참조하세요.*
다음 방법을 사용하여 인스턴스가 기본 인스턴스인지 보조 인스턴스인지 확인할 수 있습니다.
app.isPrimary();
// or
app.isSecondary();
참고: 기본 인스턴스가 종료되면 보조 플래그가 설정되었더라도 새로 시작된 인스턴스가 기본 인스턴스를 대체합니다.*
이 저장소에는 세 가지 예가 제공됩니다.
examples/basic
examples/calculator
발생시키는 그래픽 응용 프로그램의 예examples/sending_arguments
를 보내는 콘솔 애플리케이션 각 주요 버전은 매우 중요한 변경 사항을 도입하거나 이전 버전과 호환되지 않습니다. 마이너 버전은 추가 기능, 버그 수정 또는 성능 개선만 추가하며 이전 릴리스와 역호환됩니다. 자세한 내용은 CHANGELOG.md를 참조하세요.
라이브러리는 스레드로부터 안전하고 경쟁 조건이 발생하지 않도록 보장하는 QSharedMemory
블록으로 구현됩니다. 또한 QLocalSocket
을 사용하여 새 인스턴스가 생성되었음을 기본 프로세스에 알리고 따라서 instanceStarted()
신호를 호출하고 기본 인스턴스에 메시지를 보냅니다.
또한 라이브러리는 *nix 시스템에서 강제로 종료된 것을 복구할 수 있으며 실행 중인 다른 인스턴스가 없는 경우 메모리 블록을 재설정합니다.
BSD 라이센스에 따라 배포되는 Qt 계산기 예제를 제외한 이 라이브러리와 지원 문서는 다음과 같은 추가 조건과 함께 The MIT License (MIT)
조건에 따라 릴리스됩니다.
Permission is not granted to use this software or any of the associated files
as sample data for the purposes of building machine learning models.