Наблюдайте за изменениями в QSharedMemory

у меня есть QSharedMemory чтобы предотвратить одновременное выполнение двух процессов моего приложения. Процесс A устанавливает QSharedMemory в состояние «заблокировано» при запуске. Теперь мой процесс B устанавливает значение типа «пожалуйста, вернитесь на передний план».

Есть ли простой способ для процесса A наблюдать изменения в QSharedMemory, то есть избегать реализации глупого таймера вытягивания?

4

Решение

Мы здесь: QSystemSemaphore

Как и его более легкий аналог QSemaphore, доступ к QSystemSemaphore можно получить из нескольких потоков. В отличие от QSemaphore, QSystemSemaphore также может быть доступен из нескольких процессов.

подобно QSharedMemory, QSystemSemaphore использует метод доступа на основе ключа.

2

Другие решения

Вместо использования общей памяти процесс может открыть QLocalSocket на именованный локальный сервер QLocalServer, Все последующие процессы будут успешны, чтобы открыть сокет для сервера, и может связаться с ним. Это, вероятно, самый простой, самый портативный способ выполнения работы.

Вы также можете использовать QtSingleApplication, если он был портирован на Qt 5.

1

Чтобы ответить на ваш вопрос: Нет, QSharedMemory не имеет такой функции.

Если вы просто хотите иметь приложение с одним экземпляром, вы можете использовать https://github.com/Skycoder42/QSingleInstance.

Это гарантирует, что у вас есть только 1 экземпляр вашего приложения за раз, может автоматически выводить активное окно на передний план и позволяет передавать параметры из нового процесса в запущенный.

Простой пример:

#include "mainwindow.h"#include <QApplication>
#include <QMessageBox>
#include <qsingleinstance.h>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSingleInstance instance;

MainWindow *w = NULL;

instance.setStartupFunction([&]() -> int {
w = new MainWindow(NULL);
instance.setNotifyWindow(w);
w->show();
return 0;
});

QObject::connect(qApp, &QApplication::aboutToQuit, [&](){
delete w;
});

QObject::connect(&instance, &QSingleInstance::instanceMessage, [&](QStringList args){
QMessageBox::information(w, "Message", args.join('\n'));
});

return instance.singleExec();
}

Это покажет главное окно, как вы ожидаете. Если приложение запускается во второй раз, работающее в данный момент основное окно будет выведено на передний план, и отобразится окно сообщения с аргументами.

Примечание. В этом примере используются QWidgets, но QSingleInstance может также использоваться с графическим или основным приложением.

1
По вопросам рекламы [email protected]