Qt:使用QSharedMemory的单实例应用程序

时间:2014-08-05 09:42:50

标签: qt

我查看了几个如何创建单个实例应用程序的示例,他们都使用了QSharedMemory的create()和attach()方法。他们为什么需要attach()?

这似乎完美无缺:

bool SingleInstanceApplication::useSharedMemory()
{
    _sharedMemory.setKey(_uniqueKey);

    // If shared memory is created and attached successfuly,
    // no other application instace is running
    bool hasNoPreviousInstance = _sharedMemory.create(1);

    return !hasNoPreviousInstance;
}

根据我对文档的理解。这已经足够了。

一个例子是:http://developer.nokia.com/community/wiki/Run_only_one_instance_of_a_Qt_application

2 个答案:

答案 0 :(得分:2)

他们需要attach(),因为create()可能由于该段已存在的其他原因而失败。例如,系统可能没有资源,或者为应用程序禁用了共享内存段创建(例如,通过SELinux)。在这种情况下,create()将返回false,但error()将返回不同的错误代码(例如QSharedMemory::OutOfResources)并且您将无法找到某个段已存在,而attach() {1}}会找到它。

答案 1 :(得分:0)

我在Linux发行版上测试一个最小的案例:

#include <QCoreApplication>
#include <QSharedMemory>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    const char* MEM_KEY = "42";

    QSharedMemory sharedMem(MEM_KEY);

    if (sharedMem.create(1024)) {
        qDebug() << "Create shared memory";
    } else {
        if (sharedMem.error() == QSharedMemory::AlreadyExists) {
            qWarning() << "Already create. Exiting process";
            return 1;
        } else {
             // handle other possible errors
        }
    }
    return a.exec();
}

正如您所建议的那样,对create的调用似乎足以使出现错误。根据我的理解,attach仅在第二个进程想要访问已创建的共享内存时调用。但是,这并不是单一申请人的目的。