2016-08-05 20 views
1

Ich mache eine Qt 5-Anwendung, die die Dateien eines bestimmten Typs liest, und ich möchte es auf eine Instanz beschränken. Und ich möchte Befehlszeilenargumente von der 2. Instanz an die 1. Instanz übergeben, um eine Datei zu öffnen, wenn der Benutzer auf diese Datei doppelklickt.Machen Sie die zweite Instanz einer Qt5-Anwendung Transfer Befehlszeilenargumente an die erste Instanz

Die meisten Informationen, die ich gefunden habe, befasst sich damit, die Ausführung der zweiten Instanz einfach zu deaktivieren und keine Daten weiterzuleiten. Ich habe QLocalServer gefunden, aber anscheinend wird es nicht zerstört, wenn die Anwendung unter GNU/Linux abstürzt, ich habe auch boost::interprocess::message_queue gefunden, aber es sieht so aus, als müsste ich einen dedizierten Thread haben, der daraus lesen wird. Hier ist das nächste, was ich gefunden habe: https://github.com/itay-grudev/SingleApplication/ Es bietet ein Signal, das ich hören kann, aber leider keine Möglichkeit bietet, die Befehlszeile zu übergeben.

Was ist die beste Lösung? Die Betriebssysteme, die mir wichtig sind, sind GNU/Linux, Mac, Windows und vorzugsweise Android.

+0

Sie möchten QtSingleApplication. – peppe

+0

@peppe Wenn Sie eine Schritt-für-Schritt-Lösung bereitstellen, werde ich es versuchen und akzeptieren, wenn es funktioniert. Ich habe bisher nur Qt 4-Versionen gefunden. – Lyberta

+0

QtSingleApplication hat in Qt 5 eine Weile funktioniert. Sie können es von [hier] (https://code.qt.io/cgit/qt-solutions/qt-solutions.git/) oder seinem verbesserten Fork von [hier] (https://code.qt.io /cgit/qt-creator/qt-creator.git/tree/src/shared). Dann verwenden Sie es einfach anstelle von 'Q (Core) Application' und es gibt Ihnen Signale, wenn ein anderer Peer eine Verbindung zu Ihrer Instanz herstellt, und eine Methode, um Daten an die laufende Instanz zu senden. Ein Beispiel finden Sie [hier] (https://github.com/qtproject/qt-solutions/blob/master/qtsingleapplication/examples/loader/main.cpp#L128). – peppe

Antwort

0

OK, ich habe @ peppes Vorschlag gefolgt und Code in this example verwendet und es hat funktioniert.

0

Eine weitere Methode besteht darin, einen Unix-Domain-Socket unter Verwendung eines vordefinierten Socket-Namens oder eines lokalen TCP-Sockets (auf Plattformen, die keine Unix-Sockets unterstützen) zu erstellen und zu binden. Bind ist nur für die erste Instanz Ihrer Anwendung erfolgreich. Das OS entbindet den Socket, wenn die Anwendung aus irgendeinem Grund beendet wird. Wenn bind() fehlschlägt, bedeutet dies, dass eine andere Instanz der Anwendung bereits ausgeführt wird. Die zweite Instanz kann connect() und diesen Socket verwenden, um seine Befehlszeilenargumente an die erste Instanz zu übergeben.