Я пытаюсь написать класс SingleApplication
, который позволит только одному экземпляру программы работать. Я использую это, используя QSharedMemory
QSharedMemory :: create() issue
Программа работает нормально, если только я не использую ключ со значением "42"
. Что-то не так, что я делаю? Это неопределенное поведение?
main.cpp
int main(int argc, char *argv[])
{
//QApplication a(argc, argv);
SingleApplication a(argc, argv, "42"); //Does not work with '42'. Will work for any other value.
MainWindow w;
w.show();
return a.exec();
}
SingleApplication.h
class SingleApplication : public QApplication
{
Q_OBJECT
public:
SingleApplication(int &argc, char *argv[], const QString uniqueKey);
bool alreadyExists() const{ return bAlreadyExists; }
bool isMasterApp() const { return !alreadyExists(); }
bool sendMessage(const QString &message);
public slots:
//void checkForMessages();
signals:
//void messageAvailable(const QStringList& messages);
private:
bool bAlreadyExists;
QSharedMemory sharedMemory;
};
SingleApplication.cpp
SingleApplication::SingleApplication(int &argc, char *argv[], const QString uniqueKey) : QApplication(argc, argv){
sharedMemory.setKey(uniqueKey);
//Create if one does not exist already
if(sharedMemory.create(5000))
{
qDebug() << "Created!";
bAlreadyExists = false;
}
else{
if(sharedMemory.error() == QSharedMemory::AlreadyExists){
qWarning() << "Program is already running!";
}
}
}
Что конкретная ошибка? – Oncaphillis
@Oncaphillis 'sharedMemory.create()' просто возвращает false. Даже в первый раз программа запускается. –
Может ли быть, что сегмент разделяемого сегмента «42» уже используется другим процессом/потоком? Я только сейчас из linux, и ключи - это просто цифры, которые могут быть одинаковыми для разных процессов. Однако есть помощники, которые должны помочь вам сохранить их уникальными. Попробуйте инструмент, в котором перечислены сегменты currenr shm. – Oncaphillis