国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt 實(shí)現(xiàn)應(yīng)用程序單實(shí)例

這篇具有很好參考價(jià)值的文章主要介紹了Qt 實(shí)現(xiàn)應(yīng)用程序單實(shí)例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、實(shí)現(xiàn)方案

目前使 Qt 運(yùn)行一個(gè)實(shí)例有如下幾種方式:
1.QSharedMemory
使用共享內(nèi)存,當(dāng)?shù)诙€(gè)進(jìn)程啟動(dòng)時(shí),判斷內(nèi)存區(qū)數(shù)據(jù)是否建立,如有,則退出;這種方式有弊端,在程序發(fā)生崩潰時(shí),未及時(shí)清除共享區(qū)數(shù)據(jù),導(dǎo)致程序不能正常啟動(dòng)。
2.文件鎖
在程序運(yùn)行的時(shí)候就在目錄下創(chuàng)建一個(gè)文件,當(dāng)程序運(yùn)行時(shí)就判斷這個(gè)文件是否存在,如果存在說(shuō)明程序已經(jīng)在運(yùn)行。其本質(zhì)與 QSharedMemory 相同。
3.利用QLocalServer
使Qt應(yīng)用程序能夠單實(shí)例運(yùn)行的典型實(shí)現(xiàn)方法是使用共享內(nèi)存實(shí)現(xiàn)。該方法實(shí)現(xiàn)簡(jiǎn)單,代碼簡(jiǎn)潔。
但有一個(gè)致命缺陷:共享內(nèi)存(QSharedMemory)實(shí)現(xiàn)的單程序運(yùn)行,當(dāng)運(yùn)行環(huán)境是UNIX時(shí),并且程序不幸崩潰,會(huì)導(dǎo)致共享內(nèi)存無(wú)法釋放,從而無(wú)法重新運(yùn)行程序!
4.QtSingleApplication
使用 Qt 擴(kuò)展庫(kù) QtSingleApplication,能很好的解決這個(gè)問(wèn)題。
QSingleApplication 是 Qt 提供的一個(gè) solution ,它不包含在 Qt 的 library 中。遵循 LGPL 協(xié)議。Qt 歡迎里面有例子。

二、實(shí)現(xiàn)代碼

下面給出了 LocalServer 方式的實(shí)現(xiàn)代碼。

SingleApplication.h:

#ifndef SINGLEAPPLICATION_H
#define SINGLEAPPLICATION_H

#include <QObject>
#include <QApplication>
#include <QtNetwork/QLocalServer>
#include <QWidget>

class SingleApplication : public QApplication {
        Q_OBJECT
    public:
        SingleApplication(int &argc, char **argv);

        bool isRunning();                // 是否已經(jīng)有實(shí)例在運(yùn)行
        QWidget *w;                        // MainWindow指針

    private slots:
        // 有新連接時(shí)觸發(fā)
        void _newLocalConnection();

    private:
        // 初始化本地連接
        void _initLocalConnection();
        // 創(chuàng)建服務(wù)端
        void _newLocalServer();
        // 激活窗口
        void _activateWindow();

        bool _isRunning;                // 是否已經(jīng)有實(shí)例在運(yùn)行
        QLocalServer *_localServer;     // 本地socket Server
        QString _serverName;            // 服務(wù)名稱(chēng)
};

#endif // SINGLEAPPLICATION_H

SingleApplication.cpp:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-497979.html

#include "SingleApplication.h"
#include <QtNetwork/QLocalSocket>
#include <QFileInfo>

#define TIME_OUT                (500)    // 500ms

SingleApplication::SingleApplication(int &argc, char **argv)
    : QApplication(argc, argv)
    , w(NULL)
    , _isRunning(false)
    , _localServer(NULL) {

    // 取應(yīng)用程序名作為L(zhǎng)ocalServer的名字
    _serverName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();

    _initLocalConnection();
}



// 說(shuō)明:
// 檢查是否已經(jīng)有一個(gè)實(shí)例在運(yùn)行, true - 有實(shí)例運(yùn)行, false - 沒(méi)有實(shí)例運(yùn)行

bool SingleApplication::isRunning() {
    return _isRunning;
}


// 說(shuō)明:
// 通過(guò)socket通訊實(shí)現(xiàn)程序單實(shí)例運(yùn)行,監(jiān)聽(tīng)到新的連接時(shí)觸發(fā)該函數(shù)

void SingleApplication::_newLocalConnection() {
    QLocalSocket *socket = _localServer->nextPendingConnection();
    if(socket) {
        socket->waitForReadyRead(2*TIME_OUT);
        delete socket;

        // 其他處理,如:讀取啟動(dòng)參數(shù)

        _activateWindow();
    }
}


// 說(shuō)明:
// 通過(guò)socket通訊實(shí)現(xiàn)程序單實(shí)例運(yùn)行,
// 初始化本地連接,如果連接不上server,則創(chuàng)建,否則退出

void SingleApplication::_initLocalConnection() {
    _isRunning = false;

    QLocalSocket socket;
    socket.connectToServer(_serverName);
    if(socket.waitForConnected(TIME_OUT)) {
        fprintf(stderr, "%s already running.\n",
                _serverName.toLocal8Bit().constData());
        _isRunning = true;
        // 其他處理,如:將啟動(dòng)參數(shù)發(fā)送到服務(wù)端
        return;
    }

    //連接不上服務(wù)器,就創(chuàng)建一個(gè)
    _newLocalServer();
}


// 說(shuō)明:
// 創(chuàng)建LocalServer

void SingleApplication::_newLocalServer() {
    _localServer = new QLocalServer(this);
    connect(_localServer, SIGNAL(newConnection()), this, SLOT(_newLocalConnection()));
    if(!_localServer->listen(_serverName)) {
        // 此時(shí)監(jiān)聽(tīng)失敗,可能是程序崩潰時(shí),殘留進(jìn)程服務(wù)導(dǎo)致的,移除之
        if(_localServer->serverError() == QAbstractSocket::AddressInUseError) {
            QLocalServer::removeServer(_serverName); // <-- 重點(diǎn)
            _localServer->listen(_serverName); // 再次監(jiān)聽(tīng)
        }
    }
}


// 說(shuō)明:
// 激活主窗口

void SingleApplication::_activateWindow() {
    if(w) {
        w->show();
        w->raise();
        w->activateWindow(); // 激活窗口
    }
}

調(diào)用示例:

#include "MainWindow.h"
#include "SingleApplication.h"

int main(int argc, char *argv[]) {
    SingleApplication a(argc, argv);
    if(!a.isRunning()) {
        MainWindow w;
        a.w = &w;

        w.show();

        return a.exec();
    }
    return 0;
}

到了這里,關(guān)于Qt 實(shí)現(xiàn)應(yīng)用程序單實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于Qt、PYTHON智能校園防御系統(tǒng)應(yīng)用程序,實(shí)現(xiàn)了攝像頭數(shù)據(jù)采集、人臉識(shí)別、口罩識(shí)別、 數(shù)據(jù)統(tǒng)計(jì)等功能

    基于Qt、PYTHON智能校園防御系統(tǒng)應(yīng)用程序,實(shí)現(xiàn)了攝像頭數(shù)據(jù)采集、人臉識(shí)別、口罩識(shí)別、 數(shù)據(jù)統(tǒng)計(jì)等功能

    完整項(xiàng)目地址:https://download.csdn.net/download/lijunhcn/88453470 項(xiàng)目結(jié)構(gòu) 環(huán)境選型 語(yǔ)言:Python 操作系統(tǒng):Windows 數(shù)據(jù)庫(kù):MySQL 窗口界面:PyQT API接口:百度AI接口,用以實(shí)現(xiàn)人臉登陸與注冊(cè) 遠(yuǎn)程MySQL表結(jié)構(gòu) 遠(yuǎn)程表結(jié)構(gòu)sql腳本 項(xiàng)目背景 智能校園防御軟件是實(shí)現(xiàn)了一款基于攝像頭數(shù)據(jù)

    2024年02月03日
    瀏覽(28)
  • 畢設(shè)項(xiàng)目——基于Qt、PYTHON智能校園防御系統(tǒng)應(yīng)用程序,實(shí)現(xiàn)了攝像頭數(shù)據(jù)采集、人臉識(shí)別、口罩識(shí)別、 數(shù)據(jù)統(tǒng)計(jì)等功能

    畢設(shè)項(xiàng)目——基于Qt、PYTHON智能校園防御系統(tǒng)應(yīng)用程序,實(shí)現(xiàn)了攝像頭數(shù)據(jù)采集、人臉識(shí)別、口罩識(shí)別、 數(shù)據(jù)統(tǒng)計(jì)等功能

    完整項(xiàng)目地址:https://download.csdn.net/download/lijunhcn/88453470 項(xiàng)目結(jié)構(gòu) 環(huán)境選型 語(yǔ)言:Python 操作系統(tǒng):Windows 數(shù)據(jù)庫(kù):MySQL 窗口界面:PyQT API接口:百度AI接口,用以實(shí)現(xiàn)人臉登陸與注冊(cè) 遠(yuǎn)程MySQL表結(jié)構(gòu) 遠(yuǎn)程表結(jié)構(gòu)sql腳本 項(xiàng)目背景 智能校園防御軟件是實(shí)現(xiàn)了一款基于攝像頭數(shù)據(jù)

    2024年02月04日
    瀏覽(25)
  • 《Qt開(kāi)發(fā)》MDI應(yīng)用程序

    《Qt開(kāi)發(fā)》MDI應(yīng)用程序

    實(shí)現(xiàn)多個(gè)子窗體的自定義布局(自定義子窗體尺寸和位置)、平鋪布局(titleSubWindows)和分頁(yè)模式(QMdi::TabbedView)。 運(yùn)行效果圖 初始布局(自定義布局) 平鋪布局 多頁(yè)模式 實(shí)現(xiàn)過(guò)程 1. 創(chuàng)建項(xiàng)目MdiFirstDemo,并創(chuàng)建3個(gè)子窗體,分別為FirstSubWindow、SecondSubWindow和ThirdSubWindow。

    2024年01月16日
    瀏覽(85)
  • 【QT】MDI應(yīng)用程序設(shè)計(jì)

    【QT】MDI應(yīng)用程序設(shè)計(jì)

    目錄 1 MDI簡(jiǎn)介 2 文檔窗口類(lèi)QFormDoc的設(shè)計(jì) 3 MDI主窗口設(shè)計(jì)與子窗口的使用 3.1 主窗口界面設(shè)計(jì) 3.2 MDI子窗口的創(chuàng)建與加入 3.3 QMdiArea常用功能函數(shù) 3.4 MDI的信號(hào) ?? ??? ?傳統(tǒng)的應(yīng)用程序設(shè)計(jì)中有多文檔界面(Multi-documentInterface,MDI)應(yīng)用程序,Qt為設(shè)計(jì) MDI應(yīng)用程序提供了支持。

    2024年01月25日
    瀏覽(33)
  • 【QT】多窗體應(yīng)用程序設(shè)計(jì)

    【QT】多窗體應(yīng)用程序設(shè)計(jì)

    目錄 1主要的窗體類(lèi)及其用途 2 窗體類(lèi)重要特性的設(shè)置 2.1 setAttribute()函數(shù) 2.2 setWindowFlags()函數(shù) 2.3 setWindowState()函數(shù) 2.4 setWindowModality()函數(shù) 2.5 setWindowOpacity()函數(shù) 3 多窗口應(yīng)用程序的設(shè)計(jì) 3.1 主窗口設(shè)計(jì) 3.2 QFormDoc類(lèi)的設(shè)計(jì) 3.3 QFormDoc類(lèi)的使用 3.4 QFormTable類(lèi)的設(shè)計(jì) 3.5 QFormTable類(lèi)的使

    2024年01月18日
    瀏覽(29)
  • <QT開(kāi)發(fā)> QT開(kāi)發(fā)工具-之-QT應(yīng)用程序打包

    <QT開(kāi)發(fā)> QT開(kāi)發(fā)工具-之-QT應(yīng)用程序打包

    <QT開(kāi)發(fā)> QT開(kāi)發(fā)工具-之-QT應(yīng)用程序打包 筆者為什么會(huì)寫(xiě)這篇文章呢?這是因?yàn)椋P者使用windows QT開(kāi)發(fā)了一個(gè)測(cè)試工具。目的是通過(guò)TCP/IP測(cè)試其它應(yīng)用程序。首先這個(gè)QT程序是筆者自己開(kāi)發(fā)的,所以筆者的電腦當(dāng)然是可以運(yùn)行這個(gè)QT程序的,但是想要這個(gè)QT程序在其它同事的

    2024年02月12日
    瀏覽(842)
  • Qt應(yīng)用程序中的 QApplication

    QApplication類(lèi)是一個(gè)Qt框架中核心的應(yīng)用程序類(lèi),它提供了管理應(yīng)用程序的框架、事件循環(huán)和系統(tǒng)級(jí)配置的基礎(chǔ)。在本文中,我們將詳細(xì)介紹QApplication類(lèi)的功能和應(yīng)用場(chǎng)景。 通常,我們?cè)谥骱瘮?shù)中創(chuàng)建 QApplication 對(duì)象。在創(chuàng)建時(shí),我們可以指定一些命令行選項(xiàng)和特定于平臺(tái)的參

    2024年02月15日
    瀏覽(23)
  • Qt Linux 環(huán)境中應(yīng)用程序打包

    Qt Linux 環(huán)境中應(yīng)用程序打包

    系統(tǒng)環(huán)境:Ubuntu20.04LTS 開(kāi)發(fā)環(huán)境:Qt5.14.1 在進(jìn)入程序部署打包之前,閱讀官方的部署文檔Deploy,通常情況下,我們?cè)陂_(kāi)發(fā)的時(shí)候,Qt Creator 的左下角構(gòu)建模式為Debug,便于我們調(diào)試編寫(xiě)程序。Qt的三個(gè)構(gòu)建模式Debug、Profile、Release的區(qū)別是: debug可以調(diào)試程序,而release不可以。在

    2024年02月01日
    瀏覽(88)
  • qt隨記:拖動(dòng)文件方式打開(kāi)應(yīng)用程序

    qt隨記:拖動(dòng)文件方式打開(kāi)應(yīng)用程序

    結(jié)果 即從main入口進(jìn)入

    2024年02月10日
    瀏覽(23)
  • 基于Qt HTTP應(yīng)用程序項(xiàng)目案例

    main函數(shù)創(chuàng)建對(duì)象空間,確認(rèn)窗口的大小和坐標(biāo)。

    2024年02月07日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包