zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    多个断言连续执行pytest-assume && try except assert 错误思路
    allure钩子函数 && selenium 截图的四种方式 && allure集成错误截图报告
    --clean-alluredir && 用例优先级@allure.severity
    参数化(parametrize)allure用例描述的两种方式 第二种重点
    allure step 编写测试用例的两种方式
    allure与测试用例的故事 feature story title issue
    windows安装jenkins并集成allure 附jenkins插件安装缓慢问题
    git 使用开发 pycharm远程提交到仓库
    Java 集合框架
    Java 迭代器iterator
  • 原文地址:https://www.cnblogs.com/findumars/p/4965216.html
Copyright © 2011-2022 走看看