Я хочу, чтобы мое приложение открыло только один процесс, т.е. если один процесс уже открыт и пользователь хочет снова открыть exe - он не откроет другой процесс.
как я могу это сделать в Qt-linux?
10x!
Я хочу, чтобы мое приложение открыло только один процесс, т.е. если один процесс уже открыт и пользователь хочет снова открыть exe - он не откроет другой процесс.
как я могу это сделать в Qt-linux?
10x!
То, что вы ищете, QtSingleApplication
.
Если вы запустите другой экземпляр вашего приложения, первый из них даже получит уведомление об этом (вы можете передать любую структуру данных, которая вам нужна).
Я использовал его для переноса существующего приложения на фронт, когда запускается другой экземпляр.
Используйте следующий код в 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();
}
Это может не касаться вас, но я подумал, что было бы полезно поднять его. Я использую QtSingleApplication
сам и несколько дней назад испытал какое-то странное поведение. QtSingleApplication
, похоже, не работает при любых обстоятельствах. Я сделал это expierence в окнах, но в зависимости от того, что это ошибка конкретного окна или предназначена для дизайна QtSingleApplication
, она также может применяться к Linux.
В зависимости от того, как вы запускаете приложение, возможны несколько экземпляров. Я сделал этот опыт, когда сделал тестовый диск моего приложения, используя мой установщик. Установщик автоматически запускает приложение после завершения. Когда я начал свое приложение, используя ссылку на рабочем столе, у меня было два экземпляра. Таким образом, функциональность QtSingleApplication
, по-видимому, зависит от способа запуска (и с какого пользователя?) Приложения. Документация неясно об этом. Но я думаю, что обычно можно ожидать, что это будет работать при любых обстоятельствах, если не указано иное.
Итак, если вам не нужна дополнительная функциональность, добавленная QtSingleApplication
, QSystemSemaphore
или QSharedMemory
, кажется, лучший способ.
Ваше приложение может проверить наличие определенного файла в домашнем каталоге пользователя. Если он присутствует, приложение завершает работу. Если его там нет, приложение создает его и продолжает. Конечно, вы можете получить условие гонки, если пользователь запускает приложение несколько раз подряд. Но для большинства случаев это простое решение должно быть достаточным.