观察QSharedMemory

时间:2016-05-09 16:55:47

标签: c++ qt shared-memory qsharedmemory

我有一个QSharedMemory来阻止我的应用程序的两个进程同时运行。进程A将QSharedMemory设置为" locked"什么时候开始现在我的流程B设置了一个类似&#34的值;请回到前台"。

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

3 个答案:

答案 0 :(得分:2)

我们是:QSystemSemaphore

  

与其较轻的对应QSemaphore一样,可以从多个线程访问QSystemSemaphore。与QSemaphore不同,QSystemSemaphore也可以从多个进程访问。

QSharedMemory一样,QSystemSemaphore使用基于密钥的访问方法。

答案 1 :(得分:1)

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

如果已将QtSingleApplication移植到Qt 5,您也可以使用SetWinEventHook()

答案 2 :(得分: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或核心应用程序一起使用。