我有一个QSharedMemory来防止我的应用程序的两个进程同时运行。进程 A 在启动时将 QSharedMemory 设置为“锁定”。现在我的流程 B 设置了一个值,例如“请回到前台”。
进程 A 是否有一种简单的方法可以观察 QSharedMemory 的变化,即避免实现愚蠢的拉动计时器?
我有一个QSharedMemory来防止我的应用程序的两个进程同时运行。进程 A 在启动时将 QSharedMemory 设置为“锁定”。现在我的流程 B 设置了一个值,例如“请回到前台”。
进程 A 是否有一种简单的方法可以观察 QSharedMemory 的变化,即避免实现愚蠢的拉动计时器?
我们到了:QSystemSemaphore
像它的轻量级 QSemaphore 一样,可以从多个线程访问 QSystemSemaphore。与 QSemaphore 不同,QSystemSemaphore 也可以从多个进程中访问。
Like QSharedMemory
,QSystemSemaphore
使用基于密钥的访问方法。
回答您的问题:不,QSharedMemory
没有这样的功能。
如果您只想拥有一个“单实例”应用程序,您可以使用https://github.com/Skycoder42/QSingleInstance。
它使您一次只有一个应用程序实例,可以自动将活动窗口置于最前面,并允许您将参数从新进程传递给正在运行的进程。
简单的例子:
#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
也可以与 gui 或核心应用程序一起使用。
该进程可以不使用共享内存,而是打开QLocalSocket
一个命名本地服务器,当它失败时,打开一个QLocalServer
. 所有后续进程都将成功打开到服务器的套接字,并可以与其通信。这可能是完成这项工作的最简单、最便携的方式。
您也可以使用QtSingleApplication
, 如果它已被移植到 Qt 5。