我查看了几个如何创建单个实例应用程序的示例,他们都使用了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
答案 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
仅在第二个进程想要访问已创建的共享内存时调用。但是,这并不是单一申请人的目的。