中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt怎么實現自動清理早期數據功能

發布時間:2022-07-12 09:44:09 來源:億速云 閱讀:223 作者:iii 欄目:開發技術

今天小編給大家分享一下Qt怎么實現自動清理早期數據功能的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    功能特點

    1 軟件模塊

    設備監控模塊,包括數據監控(表格形式展示)、設備面板(面板形式展示)、地圖監控(地圖形式展示)、曲線監控(曲線形式展示)。

    數據查詢模塊,包括報警記錄、運行記錄、操作記錄。

    系統設置模塊,包括基本設置、端口管理、控制器管理、探測器管理、報警聯動、類型設置等。

    其他設置模塊,包括用戶管理、地圖管理、位置調整、組態設計、設備調試等。

    2 基礎功能

    1. 設備數據采集,支持串口、網絡,串口可設置串口號、波特率,網絡可設置IP地址、通訊端口。

    2. 每個端口支持采集周期時間,默認1秒鐘一個設備。

    3. 支持設置通訊超時次數,默認3次。

    4. 支持最大重連時間,用于重新讀取離線的設備。

    5. 控制器信息,能夠添加控制器名稱,選擇控制器地址、控制器型號,設置該控制器下面的探測器數量。

    6. 探測器信息,能夠添加位號、探測器型號、氣體種類、氣體符號、高報值、低報值、緩沖值、清零值、是否啟用、報警聲音、背景地圖、存儲周期、數值換算小數點位數、報警延時時間、報警的類型(HH,LL,HL)等。

    7. 類型管理可配置控制器型號、探測器型號、氣體種類、氣體符號等。

    8. 地圖支持導入和刪除,所有的探測器在地圖上的位置可自由拖動保存。

    9. 端口信息、控制器信息、探測器信息、類型信息、用戶信息等,都支持導入、導出、導出到excel、打印。

    10. 運行記錄、報警記錄、操作記錄,都支持多條件組合查詢,比如時間段、控制器、探測器等,所有記錄支持導出到excel/pdf和打印。

    11. 運行記錄、報警記錄、操作記錄都可刪除指定時間范圍內的數據。

    12. 系統設置可選擇對應表最大保存記錄數,自動清理早期數據,留出足夠的空間存儲重要的數據。

    13. 報警短信轉發,支持多個接收手機號碼,可設定發送間隔,比如即時發送或者6個小時發送一次所有的報警信息,短信內容過長,自動拆分多條短信。

    14. 報警郵件轉發,支持多個接收郵箱,可設定發送間隔,比如即時發送或者6個小時發送一次所有的報警信息,支持附件發送。

    15. 設置軟件的中文標題、英文標題、logo路徑、版權所有等。

    16. 開關設置開機運行、報警聲音、自動登錄、記住密碼等。

    17. 報警聲音可設置播放次數,界面風格樣式提供18套皮膚文件選擇。

    18. 用戶管理,包括用戶權限配置,不同用戶可以有不同模塊的權限。

    19. 用戶登錄和用戶退出,可以記住密碼和自動登錄,超過三次報錯提示并關閉程序。

    20. 四種監控模式,設備面板監控、地圖監控、表格數據監控、曲線數據監控,可自由切換,四種模式下都實時展示采集到的數據,報警閃爍等。

    21. 報警繼電器聯動,一個位號可以跨串口聯動多個模塊和繼電器號,支持多對多。

    3 特色功能

    1. 通信協議支持modbus_com、modbus_tcp_rtu,后期拓展mqtt等協議。

    2. 數據源除了真實的硬件設備采集,還可選數據庫采集,這樣用戶可以安排其他程序員比如java程序員將前端采集好的數據放到數據庫,本系統直接從數據庫采集即可。數據庫采集模式可以作為通用的系統使用,更適合多人多系統協作。

    3. 智能跳過超時的設備,加快對在線設備的采集速度,當設備數量很多的時候尤其有用。

    4. 對智能跳過的超時的設備,在設定的重連時間自動采集一次,以便探測設備是否又重新上線。

    5. 每個探測器可控是否啟用,不啟用則不會采集,也不會在界面顯示,相當于運行階段臨時關閉。

    6. 探測器可設置緩沖值和報警延時時間,在該值附近波動產生的報警,不計入報警,只有持續處于報警值且超過報警延時時間才算真正報警,這樣可以規避很多波動導致的誤報。

    7. 探測器可設置存儲周期,按照設定的時間來存儲一條運行記錄,可以按照重要程度對重要性高的設定存儲周期短一些,不重要的設定大一些,這樣可以節省不少的存儲空間,也保證了重要的數據及時存儲。

    8. 探測器可設置清零值,在一些高精度高靈敏的設備可能出廠的時候默認值未必是0,需要設定清零值來表示初始值。

    9. 探測器可設置小數點,用于計算后的真實數據控制小數點點位顯示,相當于除以10、除以100、除以1000,這樣大部分的探測器數據直接通過小數點位設置控制真實換算后的值,極個別的需要特殊轉換的可以在通信協議中約定。

    10. 探測器報警的類型支持多種,有些設備是高于某個值高報,低于某個值低報,而有些設備是在最小值最大值范圍內是高報,低于最小值低報,高于最大值正常。這樣可以分情況處理,涵蓋各種報警類型。

    11. 原創數據導入、導出、打印機制,跨平臺不依賴任何組件,瞬間導出數據。

    12. 導出到excel的記錄支持所有excel、wps等表格文件版本,不依賴excel等軟件。

    13. 高報顏色、低報顏色、正常顏色、默認值顏色等,都可以自由設置。

    14. 支持云端數據同步,將本地采集到的數據實時同步到云端。

    15. 支持網絡轉發和網絡接收,網絡接收開啟后,軟件從udp接收數據進行解析。網絡轉發支持多個目標IP,這樣就實現了本地采集的軟件,自由將數據轉到客戶端,隨時查看采集到的數據。

    16. 自動記住用戶最后停留的界面以及其他配置信息,重啟后自動應用。

    17. 報警自動切換到對應的地圖,探測器按鈕閃爍,表格數據對應顏色顯示。

    18. 雙擊探測器圖標,彈出對應探測器詳細信息,可以根據需要定制回控操作。

    19. 數據庫支持多種,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金倉等。

    20. 本地設備采集到的數據實時上傳到云端,以便手機APP或者web等其他方式提取。

    21. 自帶設備模擬工具,支持不同型號的多個設備數據模擬,同時還帶數據庫數據模擬,以便在沒有設備的時候測試數據。

    22. 標準modbus協議,各種控制器類型、探測器類型、種類、符號等全部自定義,非常靈活和強大,通信協議示例數據非常完整,通用各種modbus協議系統,適用于各種應用場景接入。

    23. 同時集成了串口通信、網絡通信、數據庫通信、數據導入導出打印、通信協議解析、界面UI、全局換膚等眾多組件和知識點,非常適合新手入門和進階。

    24. 支持xp、win7、win10、、win11、linux、mac、各種國產系統(UOS、中標麒麟、銀河麒麟等)、嵌入式linux等系統。

    25. 注釋完整,項目結構清晰,超級詳細完整的使用開發手冊,精確到每個代碼文件的功能說明,不斷持續迭代版本。

    效果圖

    Qt怎么實現自動清理早期數據功能

    Qt怎么實現自動清理早期數據功能

    五、相關代碼

    int DbCleanThread::getCount()
    {
        int count = -1;
        if (!dbOk) {
            return count;
        }
    
        time.restart();
        QString sql = QString("select count(%1) from %2").arg(countName).arg(tableName);
        QSqlQuery query(database);
        if (query.exec(sql)) {
            if (query.next()) {
                count = query.value(0).toInt();
                QString msg = QString("(共 %1 條/用時 %2 秒)").arg(count).arg(getUseTime());
                emit debug(QString("%1數據庫獲取記錄行數%2").arg(dbFlag).arg(msg));
                emit receiveCount(tableName, count, time.elapsed());
            }
        }
    
        return count;
    }
    
    QStringList DbCleanThread::getCleanValue(int cleanCount)
    {
        QStringList list;
        if (!dbOk) {
            return list;
        }
    
        QSqlQuery query(database);
        query.setForwardOnly(true);
        QString sql = DbHelper::getSelectCountSql(dbType, tableName, whereColumnName, "", orderSql, cleanCount);
        if (query.exec(sql)) {
            while (query.next()) {
                list << query.value(0).toString();
            }
        }
    
        return list;
    }
    
    void DbCleanThread::cleanData()
    {
        if (!dbOk) {
            return;
        }
    
        //首先查找總記錄數,如果總記錄數超過限制,則將超出的部分按照字段排序進行刪除
        int count = getCount();
        int cleanCount = (count - maxCount);
        if (cleanCount < 100) {
            return;
        }
    
        time.restart();
    
        //每次最大清理1000條數據
        cleanCount = cleanCount > 1000 ? 1000 : cleanCount;
        //將要刪除的數據指定字段集合查詢出來
        QStringList list = getCleanValue(cleanCount);
        if (list.count() == 0) {
            return;
        }
    
        //刪除數據
        QSqlQuery query(database);
        QString sql = QString("delete from %1 where %2 in(%3)").arg(tableName).arg(whereColumnName).arg(list.join(","));
        dbOk = query.exec(sql);
        //qDebug() << TIMEMS << sql;
    
        QString msg = QString("(共 %1 條/用時 %2 秒)").arg(cleanCount).arg(getUseTime());
        if (dbOk) {
            emit debug(QString("%1數據庫清理數據成功%2").arg(dbFlag).arg(msg));
        } else {
            QString text = database.lastError().text();
            emit error(QString("%1數據庫清理數據失敗%2, 原因: %3").arg(dbFlag).arg(msg).arg(text));
            qDebug() << TIMEMS << this->objectName() << text;
        }
    }
    
    void DbCleanThread::cleanPath()
    {
        if (dirPath.isEmpty()) {
            return;
        }
    
        //找出該文件夾下的所有文件夾
        QDir dir(dirPath);
        if (!dir.exists()) {
            return;
        }
    
        //按照目錄查找,過濾文件夾,按照文件名稱排序
        dir.setFilter(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot);
        dir.setSorting(QDir::Name);
        QStringList list = dir.entryList();
    
        //遍歷所有目錄,對所有文件大小相加得到總大小,文件就在文件夾下,不會再有子目錄
        qint64 size = 0;
        foreach (QString path, list) {
            QDir d(dirPath + "/" + path);
            QFileInfoList infos = d.entryInfoList(dirFileFilter);
            foreach (QFileInfo info, infos) {
                size += info.size();
            }
    
            //轉化成MB,超過預定大小自動刪除第一個文件夾,跳出循環無需繼續判斷
            int sizeMB = size / (1024 * 1024);
            if (sizeMB >= dirMaxSize) {
                //刪除該目錄下的所有文件
                QString path = dirPath + "/" + list.at(0);
                QDir dir(path);
                dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
                QStringList files = dir.entryList();
                foreach (QString file, files) {
                    dir.remove(file);
                    qDebug() << TIMEMS << "刪除文件" << path << file;
                }
    
                //刪除文件夾本身
                dir.rmdir(path);
                QString msg = QString("(共 %1 個文件/用時 %2 秒)").arg(files.count()).arg(getUseTime());
                emit debug(QString("%1數據庫自動清理目錄成功%2").arg(dbFlag).arg(msg));
                break;
            }
        }
    }
    
    void DbCleanThread::deletePath(const QString &path)
    {
        QDir dir(path);
    #if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
        //這個方法可以遞歸徹底刪除文件夾 不管文件夾下是否有文件 比較暴力
        //此方法慎用 必須指定明確的文件夾 不然刪除默認的目錄哭都來不及 網上多個人中招
        dir.removeRecursively();
    #else
        //循環遍歷刪除文件及文件夾
        dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
        QFileInfoList fileList = dir.entryInfoList();
        foreach (QFileInfo fi, fileList) {
            if (fi.isFile()) {
                fi.dir().remove(fi.fileName());
            } else {
                deletePath(fi.absoluteFilePath());
                dir.rmpath(fi.absoluteFilePath());
            }
        }
        //最后刪除最外層的目錄
        dir.rmpath(path);
    #endif
    }

    以上就是“Qt怎么實現自動清理早期數據功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    qt
    AI

    西昌市| 玛纳斯县| 盐亭县| 新闻| 西藏| 商洛市| 伊川县| 包头市| 宁夏| 南宁市| 余江县| 哈巴河县| 威海市| 阜康市| 平度市| 瑞丽市| 肃南| 石门县| 洛隆县| 高邑县| 平度市| 沛县| 灌南县| 淅川县| 连平县| 泸定县| 琼海市| 柳州市| 扶余县| 沂水县| 绥棱县| 托克逊县| 桃园县| 潮安县| 四平市| 通渭县| 新宁县| 龙江县| 麟游县| 伊金霍洛旗| 都匀市|