これは、 Qt5
およびQt6
の QtSingleApplication の置き換えです。
アプリケーションのプライマリ インスタンスを保持し、後続の各インスタンスを強制終了します。 (有効な場合) セカンダリ (プライマリに関係のない) インスタンスを生成し、セカンダリ インスタンスからプライマリ インスタンスにデータを送信できます。
完全な使用方法のリファレンスと例はここにあります。
SingleApplication
クラスは、 QAPPLICATION_CLASS
マクロを介して指定したQ[Core|Gui]Application
クラスを継承します ( QCoreApplication
がデフォルトです)。さらなる使用法は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:
次に、 singleapplication.pri
ファイルを.pro
プロジェクト ファイルに含めます。
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)
CMake を使用する場合、このリポジトリを Git サブモジュールとして直接含めたり、ソース コードの単なるコピーを新しいプロジェクトに含めたりすることは、理想的ではない可能性があります。もう 1 つのオプションは、バージョン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
コンストラクターの 3 番目のパラメーターでそれを有効にする必要があります。デフォルトは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();
注:プライマリ インスタンスが終了すると、セカンダリ フラグが設定されている場合でも、新しく起動したインスタンスがプライマリ インスタンスに置き換わります。*
このリポジトリには 3 つの例が提供されています。
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.