2016-08-05 8 views
1

特定のタイプのファイルを読み込むQt 5アプリケーションを作成していますが、これを1つのインスタンスに制限したいとします。そして、私はコマンドライン引数を第2インスタンスから第1に転送して、ユーザーがそのファイルをダブルクリックしたときにファイルを開くようにします。Qt5アプリケーションの2番目のインスタンスを最初のインスタンスに転送するコマンドライン引数を

ほとんどの情報は、2番目のインスタンスの実行とデータの受け渡しを無効にするというものです。私はQLocalServerを見つけましたが、明らかにアプリケーションがGNU/Linuxでクラッシュしたときには破棄されませんでした。また、boost::interprocess::message_queueが見つかりましたが、そこから読み取る専用のスレッドが必要です。ここに私が見つけた最も近いものがあります:https://github.com/itay-grudev/SingleApplication/それは私が聞くことができる信号を提供しますが、残念ながらコマンドラインを渡すためのオプションを提供していません。

最適なソリューションは何ですか?私が気にするOSは、GNU/Linux、Mac、Windows、そして好ましくはAndroidです。

+0

QtSingleApplicationが必要です。 – peppe

+0

@peppeステップバイステップのソリューションを提供するなら、私はそれを試して、動作すればそれを受け入れます。私はこの前にQt 4のバージョンしか見つけなかった。 – Lyberta

+0

QtSingleApplicationはQt 5でしばらく働いています。あなたは[ここ](https://code.qt.io/cgit/qt-solutions/qt-solutions.git/)またはその改良されたフォークを[ここ](https://code.qt.io)から得ることができます。 /cgit/qt-creator/qt-creator.git/tree/src/shared)。次に、 'Q(Core)Application'の代わりに使うだけで、別のピアがあなたのインスタンスに接続したときにシグナルを出し、実行中のインスタンスにデータを送信するメソッドを提供します。例については、[here](https://github.com/qtproject/qt-solutions/blob/master/qtsingleapplication/examples/loader/main.cpp#L128)を参照してください。 – peppe

答えて

0

OK、私は@ peppeの提案に従い、this exampleにコードを使用しました。

0

別の方法は、あらかじめ定義されたソケット名またはローカルTCPソケット(UNIXソケットをサポートしていないプラットフォーム上)を使用して、Unixドメインソケットを作成し、バインドする方法です。バインドは、アプリケーションの最初のインスタンスに対してのみ成功します。何らかの理由でアプリケーションが終了すると、OSはソケットをバインド解除します。 bind()が失敗すると、アプリケーションの別のインスタンスが既に実行中であることを意味します。 2番目のインスタンスはconnect()になり、このソケットを使用してコマンドライン引数を最初のインスタンスに渡します。

関連する問題