Как заставить мое приложение открывать только один exe? QT, Linux - PullRequest
11 голосов
/ 03 ноября 2010

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

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

10x!

Ответы [ 4 ]

23 голосов
/ 03 ноября 2010

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

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

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

15 голосов
/ 03 ноября 2010

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

//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 голосов
/ 03 ноября 2010

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

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

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

0 голосов
/ 03 ноября 2010

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

...