Как сделать приложение одиночка средствами Qt5+ под Windows (xp, 7, 8, 10) ? Чтобы нельзя было запустить два экземпляра одновременно.
Файл будет удалён автоматически
Каждый пользователь может запустить свою версию.
#include <QString>
#include <QLockFile>
#include <QDir>
#include <QMessageBox>
QString tmpDir = QDir::tempPath();
QLockFile lockFile(tmpDir + "/<unique identifier>.lock");
if(!lockFile.tryLock(100)){
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setText("You already have this app running."
"\r\nOnly one instance is allowed.");
msgBox.exec();
return 1;
}
Семафоры и разделяемая память
Уникальный инстанс приложения на всю машину
QSystemSemaphore sema("<unique identifier>", 1);
sema.acquire();
#ifndef Q_OS_WIN32
// в Unix разделяемая память не чистится при креше
// Очищаем, если осталась от предыдущих запусков
QSharedMemory nix_fix_shmem("<unique identifier 2>");
if(nix_fix_shmem.attach()){
nix_fix_shmem.detach();
}
#endif
QSharedMemory shmem("<unique identifier 2>");
bool is_running;
if (shmem.attach()){
is_running = true;
}else{
shmem.create(1);
is_running = false;
}
sema.release();
if(is_running){
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
msgBox.setText("You already have this app running."
"\r\nOnly one instance is allowed.");
msgBox.exec();
return 1;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости