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(), если вынести его в отдельный метод - не срабатывает. Почему так?
Пору уточнений: метод, в который я все это выносил - создавал его как не статический (пробовал делать статическим) - вызывается другим статическим методом - вся это для статического объекта.
  • Вопрос задан
  • 1172 просмотра
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg
Любые ответы на любые вопросы
Потому что экземпляры классов, которые создаются main() должны существовать все время работы программы. А если вы их уберете в другую область видимости, они уничтожатся при выходе за эту область.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы