Данный вопрос является продолжением вот этого моего вопроса:
Соотношение многопоточности приложения 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(), если вынести его в отдельный метод - не срабатывает. Почему так?
Пору уточнений: метод, в который я все это выносил - создавал его как не статический (пробовал делать статическим) - вызывается другим статическим методом - вся это для статического объекта.