/* * Блок реализация повторного запуска программы, реализован как * кроссплатформенная составляющая из классов QT * * QSystemSemaphore semaphore("EANG41RT723PHKK1IANFGQMY", 1); // создаём семафор semaphore.acquire(); // Поднимаем семафор, запрещая другим экземплярам работать с разделяемой памятью#ifndef Q_OS_WIN32 /* в linux разделяемая память не освобождается при аварийном завершении приложения, * поэтому необходимо избавиться от данного мусора * */ QSharedMemory nix_fix_shared_memory("WEY247Y5U43HTFAG0H4DKH99"); if(nix_fix_shared_memory.attach()){ nix_fix_shared_memory.detach(); }#endif QSharedMemory sharedMemory("WEY247Y5U43HTFAG0H4DKH99"); // Создаём экземпляр разделяемой памяти bool is_running; // переменную для проверки уже запущенного приложения if (sharedMemory.attach()){ // пытаемся присоединить экземпляр разделяемой памяти к уже существующему сегменту is_running = true; // Если успешно, то определяем, что уже есть запущенный экземпляр }else{ sharedMemory.create(1); // В противном случае выделяем 1 байт памяти is_running = false; // И определяем, что других экземпляров не запущено } semaphore.release(); // Опускаем семафор // Если уже запущен один экземпляр приложения, то сообщаем об этом пользователю // и завершаем работу текущего экземпляра приложения if(is_running){ QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(QObject::tr("Приложение уже запущено.\n Вы можете запустить только один экземпляр приложения.")); msgBox.exec(); return 1; } /* * Завершение блока проверки повторного запуска программы * */