久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Qt:單實(shí)例應(yīng)用程序保護(hù)的最佳實(shí)踐

Qt: Best practice for a single instance app protection(Qt:單實(shí)例應(yīng)用程序保護(hù)的最佳實(shí)踐)
本文介紹了Qt:單實(shí)例應(yīng)用程序保護(hù)的最佳實(shí)踐的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

QSingleApplication?QMutex?QSharedMemory?我正在尋找可以在 Windows、OSX 和 Linux (Ubuntu) 中順利運(yùn)行的東西.使用 Qt 4.7.1

QSingleApplication? QMutex? QSharedMemory? I'm looking for something that will work smoothly in Windows, OSX and Linux (Ubuntu). Using Qt 4.7.1

推薦答案

簡(jiǎn)單的解決方案,滿足您的需求.沒(méi)有網(wǎng)絡(luò)依賴(lài)(如 QtSingleApplication)并且沒(méi)有任何開(kāi)銷(xiāo).

Simple solution, that does what you want. Without network dependency (as QtSingleApplication) and without any overhead.

用法:

int main()
{
    RunGuard guard( "some_random_key" );
    if ( !guard.tryToRun() )
        return 0;

    QAppplication a(/*...*/);
    // ...
}

RunGuard.h

#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

RunGuard.cpp

#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();
}

這篇關(guān)于Qt:單實(shí)例應(yīng)用程序保護(hù)的最佳實(shí)踐的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫(xiě) for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 91精品国产一区二区三区香蕉 | 欧美国产日韩在线观看 | 亚洲精品视频在线 | 国产精品视屏 | 青青草久久 | 视频一区二区中文字幕 | 亚洲三区在线观看 | 亚洲区一| 欧美一级欧美三级在线观看 | 韩国av影院 | 国产精品一区二区在线 | 欧美日韩精品一区二区三区四区 | 久久久久久国产精品免费 | 成人在线视频看看 | 91在线资源| 免费在线视频精品 | 亚洲精品国产区 | 请别相信他免费喜剧电影在线观看 | 先锋资源吧 | 天堂综合| 国产一级视频在线播放 | 国产高清精品在线 | 亚洲成人一区二区 | 日韩欧美亚洲 | 成人精品久久久 | 精品无码久久久久久国产 | 日本成人中文字幕在线观看 | 99这里只有精品视频 | 中文字幕一区在线观看视频 | 欧美一区2区三区4区公司 | 狠狠的干| 99久久精品免费看国产免费软件 | 成人18亚洲xxoo | 国产精品a久久久久 | 日本一区二区高清视频 | 香蕉91| 日韩在线视频一区二区三区 | 自拍偷拍一区二区三区 | 亚洲精品一二三 | 国产亚洲欧美在线视频 | 91亚洲国产成人久久精品网站 |