у меня есть QSharedMemory чтобы предотвратить одновременное выполнение двух процессов моего приложения. Процесс A устанавливает QSharedMemory в состояние «заблокировано» при запуске. Теперь мой процесс B устанавливает значение типа «пожалуйста, вернитесь на передний план».
Есть ли простой способ для процесса A наблюдать изменения в QSharedMemory, то есть избегать реализации глупого таймера вытягивания?
Мы здесь: QSystemSemaphore
Как и его более легкий аналог QSemaphore, доступ к QSystemSemaphore можно получить из нескольких потоков. В отличие от QSemaphore, QSystemSemaphore также может быть доступен из нескольких процессов.
подобно QSharedMemory
, QSystemSemaphore
использует метод доступа на основе ключа.
Вместо использования общей памяти процесс может открыть QLocalSocket
на именованный локальный сервер QLocalServer
, Все последующие процессы будут успешны, чтобы открыть сокет для сервера, и может связаться с ним. Это, вероятно, самый простой, самый портативный способ выполнения работы.
Вы также можете использовать QtSingleApplication
, если он был портирован на Qt 5.
Чтобы ответить на ваш вопрос: Нет, 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
может также использоваться с графическим или основным приложением.