-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
66 lines (56 loc) · 2.12 KB
/
main.cpp
File metadata and controls
66 lines (56 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "zBrainSystem.h"
#include <QtWidgets/QApplication>
#include <QSystemSemaphore>
#include <QSharedMemory>
#include <QMessageBox>
#include <QString>
#pragma comment(lib, "runtimeobject.lib")
//#pragma comment(lib, "widowsapi.lib")
const char g_szSemName[] = "-=<zBrainSystem semaphore>=-";
const char g_szSemName2[] = "123-=<zBrainSystem semaphore>=-321";
int main(int argc, char *argv[])
{
QStringList paths = QCoreApplication::libraryPaths();
paths.append(".");
paths.append("imageformats");
paths.append("platforms");
paths.append("mediaservice");
QCoreApplication::setLibraryPaths(paths);
QApplication a(argc, argv);
QSystemSemaphore semaphore(g_szSemName, 1); // создаём семафор
semaphore.acquire(); // Поднимаем семафор, запрещая другим экземплярам работать с разделяемой памятью
#ifndef Q_OS_WIN32
// в linux/unix разделяемая память не освобождается при аварийном завершении приложения,
// поэтому необходимо избавиться от данного мусора
QSharedMemory nix_fix_shared_memory(g_szSemName2);
if (nix_fix_shared_memory.attach()) {
nix_fix_shared_memory.detach();
}
#endif
QSharedMemory sharedMemory(g_szSemName2); // Создаём экземпляр разделяемой памяти
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(QString::fromLocal8Bit("Приложение уже запущено.\n"
"Вы можете запустить только один экземпляр приложения."));
msgBox.exec();
return 1;
}
zBrainSystem w;
w.show();
return a.exec();
}