【问题标题】:Observe changes in QSharedMemory观察 QSharedMemory 的变化
【发布时间】:2016-05-09 16:55:47
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt shared-memory qsharedmemory


    【解决方案1】:

    我们在这里:QSystemSemaphore

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

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

    【讨论】:

      【解决方案2】:

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

      您也可以使用QtSingleApplication,前提是它已被移植到 Qt 5。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-05
          • 2010-11-09
          • 2018-02-26
          • 2015-09-13
          • 2020-07-29
          • 2021-08-30
          • 2018-12-12
          • 2021-05-03
          相关资源
          最近更新 更多