Задать вопрос
BadCats
@BadCats

Работа с QSystemSemaphore и QSharedMemory?

Данный вопрос является продолжением вот этого моего вопроса: Соотношение многопоточности приложения c++ и многопоточности на уровне системы? (для понимания контекста)
- там, я привел ссылку: https://evileg.com/en/post/147/
- в тексте вышеприведенной статьи, автор использует следующий пример:
clude "mainwindow.h"
#include <QApplication>
#include <QSystemSemaphore>
#include <QSharedMemory>
#include <QMessageBox>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QSystemSemaphore semaphore("<uniq id>", 1);  // create semaphore
    semaphore.acquire(); // Raise the semaphore, barring other instances to work with shared memory
 
#ifndef Q_OS_WIN32
    // in linux / unix shared memory is not freed when the application terminates abnormally,
    // so you need to get rid of the garbage
    QSharedMemory nix_fix_shared_memory("<uniq id 2>");
    if(nix_fix_shared_memory.attach()){
        nix_fix_shared_memory.detach();
    }
#endif
 
    QSharedMemory sharedMemory("<uniq id 2>");  // Create a copy of the shared memory
    bool is_running;            // variable to test the already running application
    if (sharedMemory.attach()){ // We are trying to attach a copy of the shared memory
                                // To an existing segment
        is_running = true;      // If successful, it determines that there is already a running instance
    }else{
        sharedMemory.create(1); // Otherwise allocate 1 byte of memory
        is_running = false;     // And determines that another instance is not running
    }
    semaphore.release();       
 
    // If you already run one instance of the application, then we inform the user about it
    // and complete the current instance of the application
    if(is_running){
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Warning);
        msgBox.setText("The application is already running.\n" 
                       "Allowed to run only one instance of the application.");
        msgBox.exec();
        return 1;
    }
 
    MainWindow w;
    w.show();
 
    return a.exec();
}

- код работает, но только в main(), если вынести его в отдельный метод - не срабатывает. Почему так?
Пору уточнений: метод, в который я все это выносил - создавал его как не статический (пробовал делать статическим) - вызывается другим статическим методом - вся это для статического объекта.
  • Вопрос задан
  • 1433 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg
Любые ответы на любые вопросы
Потому что экземпляры классов, которые создаются main() должны существовать все время работы программы. А если вы их уберете в другую область видимости, они уничтожатся при выходе за эту область.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Uniscan Research Новосибирск
от 140 000 до 200 000 ₽
АО НПП «АМЭ» Санкт-Петербург
До 250 000 ₽
Базис-Центр Коломна
от 70 000 до 500 000 ₽