• Single Application


    如果限制一个程序同时只能启动一个实例,有几个可以使用的库

    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

  • 相关阅读:
    NYOJ-301递推求值
    二叉树
    从c到c++
    NYOJ-93汉诺塔(三)
    历届试题 最大子阵
    最大子序列和最大子矩阵
    【贪心】电视节目安排
    【贪心】线段覆盖
    【贪心】取数游戏
    【贪心】智力大冲浪
  • 原文地址:https://www.cnblogs.com/findumars/p/4965216.html
Copyright © 2020-2023  润新知