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

Qt:單實例應用程序保護的最佳實踐

Qt: Best practice for a single instance app protection(Qt:單實例應用程序保護的最佳實踐)
本文介紹了Qt:單實例應用程序保護的最佳實踐的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

QSingleApplication?QMutex?QSharedMemory?我正在尋找可以在 Windows、OSX 和 Linux (Ubuntu) 中順利運行的東西.使用 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

推薦答案

簡單的解決方案,滿足您的需求.沒有網絡依賴(如 QtSingleApplication)并且沒有任何開銷.

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

這篇關于Qt:單實例應用程序保護的最佳實踐的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

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

相關文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數據?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環: for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環?)
Reusing thread in loop c++(在循環 C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環形?)
主站蜘蛛池模板: 中文字幕亚洲一区 | 黄色一级毛片 | 国产精品久久久精品 | 欧洲成人免费视频 | 91av精品 | 玖玖爱365| av大片在线观看 | 久久久久久久国产精品视频 | 久久久久久久久99 | 国产精品高清在线 | 日本精品视频 | 成人一区二 | 国产成年人小视频 | 福利二区| 久久久精品国产 | 国产在线精品一区二区 | 色噜噜狠狠色综合中国 | 天天操,夜夜爽 | 看片网站在线 | 99精品在线 | 成人在线精品视频 | 日韩av.com| 亚洲天堂中文字幕 | 欧美一区二区在线观看 | 亚洲国产成人精品久久久国产成人一区 | 天天操操操操操 | 中文字幕伊人 | 国产精品久久久久久久久久不蜜臀 | av在线成人 | 有码在线 | 色综合一区二区 | 爱爱综合网 | 亚洲免费视频播放 | 国产精品视频一区二区三区 | 久久9热| 欧美激情在线观看一区二区三区 | 99re热精品视频国产免费 | 91精品国产综合久久久久久漫画 | 久久激情五月丁香伊人 | 国产91精品久久久久久久网曝门 | 国产日韩精品一区 |