2010-11-03 15 views
10

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

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

10x!

+3

Вы действительно должны принимать ответы на свои вопросы, если только вы не хотите, чтобы люди больше отвечали. – ereOn

ответ

0

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

+0

Я не знаю, кто это поддержал, и почему. Но это опасно и не переносится. 'Qt' имеет встроенную поддержку этой функции, поэтому разумно ее использовать. – ereOn

+0

Я согласен на «непереносимость» и что QtSingleApplication - лучший вариант. Но почему опасно? Из-за состояния гонки? Открытый открытый флаг O_CREATE в open() должен иметь дело с этим. – bew

+0

Опасно, потому что любой, кто создает этот файл вручную, может помешать вашей программе работать. – ereOn

23

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

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

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

+0

Downvoted, потому что QtSingleApplication работает только в процессе текущего пользователя.Он не будет работать, если другие пользователи начнут один и тот же процесс в других сеансах пользователя. –

+5

@JimInTexas: Не обижайтесь, но OP просто хотел, чтобы один и тот же пользователь не запускал несколько процессов своего приложения. Для этого 'QtSingleApplication' является ** точно **, что ему нужно. Теперь, возможно, это не будет соответствовать ** вашему ** конкретному варианту использования, но это не имеет отношения к вопросу. Обычно ответы отводятся вниз, потому что они ошибаются, и что касается этого вопроса, это не так. Это ? – ereOn

15

Используйте следующий код в 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(); 
} 
+0

Как открыть главное окно приложения, если приложение уже запущено? – devdev

+1

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

+3

Слишком хрупкий, я думаю - если приложение выходит из строя, оно оставляет сегмент sharedmem позади, и вы не можете перезапустить процесс. «Но если этот последний поток или процесс вылетает из строя без запуска деструктора QSharedMemory, сегмент разделяемой памяти выживает после сбоя». (Документы QSharedMemory) –

3

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

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

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

Смежные вопросы