首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >观察QSharedMemory中的变化

观察QSharedMemory中的变化
EN

Stack Overflow用户
提问于 2016-05-10 00:55:47
回答 3查看 860关注 0票数 4

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-05-10 02:03:36

我们在这里:QSystemSemaphore

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-05-10 02:49:29

所有后续进程都将成功打开到服务器的套接字,并可以与其通信。这可能是完成这项工作的最简单、最可移植的方法。

如果QtSingleApplication已经移植到Qt5,你也可以使用它。

票数 1
EN

Stack Overflow用户

发布于 2016-05-10 16:44:43

回答你的问题:不,QSharedMemory没有这样的功能。

如果你只想拥有一个“单实例”的应用程序,你可以使用https://github.com/Skycoder42/QSingleInstance

它使shure一次只有一个应用程序实例,可以自动将活动窗口放在前面,并允许您将参数从新进程传递到正在运行的进程。

简单的例子:

代码语言:javascript
复制
#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或核心应用程序一起使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37121384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档