これは、 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 singleapplicationQmake:
次に、 singleapplication.priファイルを.proプロジェクト ファイルに含めます。
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplicationCMake:
次に、 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/calculatorexamples/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.