4

我有一个QSharedMemory来防止我的应用程序的两个进程同时运行。进程 A 在启动时将 QSharedMemory 设置为“锁定”。现在我的流程 B 设置了一个值,例如“请回到前台”。

进程 A 是否有一种简单的方法可以观察 QSharedMemory 的变化,即避免实现愚蠢的拉动计时器?

4

3 回答 3

2

我们到了:QSystemSemaphore

像它的轻量级 QSemaphore 一样,可以从多个线程访问 QSystemSemaphore。与 QSemaphore 不同,QSystemSemaphore 也可以从多个进程中访问。

Like QSharedMemoryQSystemSemaphore使用基于密钥的访问方法。

于 2016-05-09T18:03:35.957 回答
1

回答您的问题:不,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 或核心应用程序一起使用。

于 2016-05-10T08:44:42.510 回答
1

该进程可以不使用共享内存,而是打开QLocalSocket一个命名本地服务器,当它失败时,打开一个QLocalServer. 所有后续进程都将成功打开到服务器的套接字,并可以与其通信。这可能是完成这项工作的最简单、最便携的方式。

您也可以使用QtSingleApplication, 如果它已被移植到 Qt 5。

于 2016-05-09T18:49:29.450 回答