如果限制一个程序同时只能启动一个实例,有几个可以使用的库
QtSingleApplication
SingleApplication
RunGuard
main.cpp
限制程序同时只能启动一个实例只需要在 main()
函数里调用 if (!guard.tryToRun()) { return 0; }
即可。
1 2 3 4 5 6 7 8 9 10 11 12 | #include "RunGuard.h" int main(int argc, char *argv[]) { RunGuard guard("9F0FFF1A-77A0-4EF0-87F4-5494CA8181C7"); if (!guard.tryToRun()) { return 0; } QApplication a(argc, argv); a.exec(); } |
RunGuard.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #ifndef RUNGUARD_H #define RUNGUARD_H #include <QObject> #include <QSharedMemory> #include <QSystemSemaphore> class RunGuard { public: RunGuard(const QString& key); ~RunGuard(); bool isAnotherRunning(); bool tryToRun(); void release(); private: const QString key; const QString memLockKey; const QString sharedmemKey; QSharedMemory sharedMem; QSystemSemaphore memLock; Q_DISABLE_COPY(RunGuard) }; #endif // RUNGUARD_H |
RunGuard.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include "RunGuard.h" #include <QCryptographicHash> namespace { QString generateKeyHash(const QString& key, const QString& salt) { QByteArray data; data.append(key.toUtf8()); data.append(salt.toUtf8()); data = QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex(); return data; } } RunGuard::RunGuard(const QString &key) : key(key) , memLockKey(generateKeyHash(key, "_memLockKey")) , sharedmemKey(generateKeyHash(key, "_sharedmemKey")) , sharedMem(sharedmemKey) , memLock(memLockKey, 1) { memLock.acquire(); { QSharedMemory fix(sharedmemKey); // Fix for *nix: http://habrahabr.ru/post/173281/ fix.attach(); } memLock.release(); } RunGuard::~RunGuard() { release(); } bool RunGuard::isAnotherRunning() { if (sharedMem.isAttached()) { return false; } memLock.acquire(); const bool isRunning = sharedMem.attach(); if (isRunning) { sharedMem.detach(); } memLock.release(); return isRunning; } bool RunGuard::tryToRun() { if (isAnotherRunning()) { // Extra check return false; } memLock.acquire(); const bool result = sharedMem.create(sizeof(quint64)); memLock.release(); if (!result) { release(); return false; } return true; } void RunGuard::release() { memLock.acquire(); if (sharedMem.isAttached()) { sharedMem.detach(); } memLock.release(); } |
http://www.qtdebug.com/qtbook-misc-single-application/
SingleApplication
https://github.com/itay-grudev/SingleApplication