Как заставить мое приложение открыть только один exe? qt, linux

Я хочу, чтобы мое приложение открыло только один процесс, т.е. если один процесс уже открыт и пользователь хочет снова открыть exe - он не откроет другой процесс.

как я могу это сделать в Qt-linux?

10x!

Ответ 1

То, что вы ищете, QtSingleApplication.

Если вы запустите другой экземпляр вашего приложения, первый из них даже получит уведомление об этом (вы можете передать любую структуру данных, которая вам нужна).

Я использовал его для переноса существующего приложения на фронт, когда запускается другой экземпляр.

Ответ 2

Используйте следующий код в main.cpp, чтобы предотвратить запуск нескольких экземпляров вашего приложения. Я тестировал этот код под Linux (в QtCreator), и он работает (работает и для Windows). Я нахожу это решение простым и легким в реализации. Пример для консольного приложения. Код остается неизменным для приложения GUI, проверьте комментарии в коде.

//main.cpp
#include <QCoreApplication> //Console application
//#include <QApplication>     //GUI application
#include <QSharedMemory>
#include <QDebug>
//Your QMainWindow derivated class goes here :
//#include "MainWindow.h"

int main(int argc, char *argv[])
{

  QCoreApplication app( argc, argv );

  app.processEvents();

  //---- Check for another instance code snippet ----

  //GUID : Generated once for your application
  // you could get one GUID here: http://www.guidgenerator.com/online-guid-generator.aspx
  QSharedMemory shared("62d60669-bb94-4a94-88bb-b964890a7e04");

  if( !shared.create( 512, QSharedMemory::ReadWrite) )
  {
    // For a GUI application, replace this by :
    // QMessageBox msgBox;
    //msgBox.setText( QObject::tr("Can't start more than one instance of the application.") );
    //msgBox.setIcon( QMessageBox::Critical );
    //msgBox.exec();

    qWarning() << "Can't start more than one instance of the application.";

    exit(0);
  }
  else {
      qDebug() << "Application started successfully.";
  }
  //---- END OF Check for another instance code snippet ----

  // Only one instance is running, declare MainWindow
  //MainWindow myMainWindow;
  //myMainWindow.show();


  //We enter the Qt Event loop here, we don't leave until the MainWindow is closed
  //or the console application is terminated.
  return app.exec();
}

Ответ 3

Это может не касаться вас, но я подумал, что было бы полезно поднять его. Я использую QtSingleApplication сам и несколько дней назад испытал какое-то странное поведение. QtSingleApplication, похоже, не работает при любых обстоятельствах. Я сделал это expierence в окнах, но в зависимости от того, что это ошибка конкретного окна или предназначена для дизайна QtSingleApplication, она также может применяться к Linux.

В зависимости от того, как вы запускаете приложение, возможны несколько экземпляров. Я сделал этот опыт, когда сделал тестовый диск моего приложения, используя мой установщик. Установщик автоматически запускает приложение после завершения. Когда я начал свое приложение, используя ссылку на рабочем столе, у меня было два экземпляра. Таким образом, функциональность QtSingleApplication, по-видимому, зависит от способа запуска (и с какого пользователя?) Приложения. Документация неясно об этом. Но я думаю, что обычно можно ожидать, что это будет работать при любых обстоятельствах, если не указано иное.

Итак, если вам не нужна дополнительная функциональность, добавленная QtSingleApplication, QSystemSemaphore или QSharedMemory, кажется, лучший способ.

Ответ 4

Ваше приложение может проверить наличие определенного файла в домашнем каталоге пользователя. Если он присутствует, приложение завершает работу. Если его там нет, приложение создает его и продолжает. Конечно, вы можете получить условие гонки, если пользователь запускает приложение несколько раз подряд. Но для большинства случаев это простое решение должно быть достаточным.