#include "mainwindow.h" #include #include #include "specialmessagebox.h" bool appIsRunningAlready(QSharedMemory& sharedMemory); QString getLanguageFromSettings(); int main(int argc, char *argv[]) { QApplication a(argc, argv); // Уникальное имя для идентификации процесса const QString sharedMemKey = "ServerMTD_sharedMemKey"; // Создание объекта общей памяти QSharedMemory sharedMemory(sharedMemKey); if(appIsRunningAlready(sharedMemory)) {//Приложение уже запущено return 1; } MainWindow w; w.initialize(); w.show(); //Закоментировать, если нужно, чтобы по-умолчанию было свернуто в трее! return a.exec(); } bool appIsRunningAlready(QSharedMemory& sharedMemory) { // Попытка прикрепления к существующему сегменту if (sharedMemory.attach(QSharedMemory::ReadWrite)) { qWarning() << "Application is running already!"; QTranslator qtLanguageTranslator; QString language; language = getLanguageFromSettings(); if(language == "RUS") qtLanguageTranslator.load(QString("translations/RRJServer_") + "ru_RU", "."); qApp->installTranslator(&qtLanguageTranslator); SpecMsgBox::CriticalClose(nullptr, QObject::tr("Application ") + QObject::tr("Maintenance training device RRJ-95NEW-100 Server") + QObject::tr(" is running already!")); return true; } else { // Приложения ещё нет, создаём сегмент памяти if (!sharedMemory.create(1)) { qCritical() << "Application launch error! Error create shared memory."; QTranslator qtLanguageTranslator; QString language; language = getLanguageFromSettings(); if(language == "RUS") qtLanguageTranslator.load(QString("translations/RRJServer_") + "ru_RU", "."); qApp->installTranslator(&qtLanguageTranslator); SpecMsgBox::CriticalClose(nullptr, QObject::tr("Application ") + QObject::tr("Maintenance training device RRJ-95NEW-100 Server") + QObject::tr(" launch error! ") + QObject::tr(" Error create shared memory.") + QObject::tr(" Contact your system administrator.")); return true; } } // Освобождаем общую память при завершении работы приложения QObject::connect(qApp, &QCoreApplication::aboutToQuit, [&]() { sharedMemory.detach(); }); return false; } QString getLanguageFromSettings() { QFile file(settingsName); if(! file.open(QIODevice::ReadOnly)) return ""; QXmlStreamReader xmlReader(&file); while (!xmlReader.atEnd()) { if(xmlReader.isStartElement()) { if(xmlReader.name() == "DataBaseSettings") { foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) { QString name = attr.name().toString(); QString value = attr.value().toString(); if(name == "Language") { file.close(); return value; } } } } xmlReader.readNext(); } file.close(); return ""; }