欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)自動清理早期數(shù)據(jù)功能

 更新時間:2022年07月11日 15:57:19   作者:feiyangqingyun  
隨著時間的增加,存儲的歷史記錄也在不斷增加,如果設(shè)備數(shù)量很多,存儲間隔很短,不用多久,數(shù)據(jù)庫中的記錄就非常多,至少是百萬級別起步,而且有些用戶還是需要存儲每一次的采集的數(shù)據(jù)。本文將利用Qt實(shí)現(xiàn)自動清理早期數(shù)據(jù),需要的可以參考一下

一、前言

隨著時間的增加,存儲的歷史記錄也在不斷增加,如果設(shè)備數(shù)量很多,存儲間隔很短,不用多久,數(shù)據(jù)庫中的記錄就非常多,至少是百萬級別起步,而且有些用戶還是需要存儲每一次的采集的數(shù)據(jù),這數(shù)據(jù)量別說一年,就是一個月下來都是恐怖級別的,所以這就涉及到一個重要的需求,如何自動清理早期的不需要的數(shù)據(jù),比如只保存最近10萬條記錄,或者保存最近30天的記錄,這就需要安排個線程,在線程中打開數(shù)據(jù)庫以后,每隔一段時間去查詢記錄數(shù)量,超過了設(shè)定的最大值,則按照時間順序把早期的數(shù)據(jù)刪除,其實(shí)就是執(zhí)行一個sql語句。如果設(shè)置的是只存儲最近30天的記錄,則每隔一段時間執(zhí)行刪除sql語句,帶上條件where 時間<(今天-30)。由于是在線程中打開的數(shù)據(jù)庫,所以在線程中執(zhí)行的sql語句都不會對主界面使用的數(shù)據(jù)庫相關(guān)處理造成卡頓。

光有數(shù)據(jù)記錄清理可能還是不夠的,比如系統(tǒng)還不斷的在存儲報(bào)警圖片或者其他數(shù)據(jù)文件,由于硬盤的大小有限,也需要一個機(jī)制做清理,尤其是對于視頻監(jiān)控系統(tǒng)尤為重要。由于和數(shù)據(jù)庫記錄清理功能類似,而且數(shù)據(jù)庫清理線程99.99%的時間都是空余的,就算是到了需要清理的時候,也是一次性清理多條,也不會頻繁的在清理中,為了不讓這個線程閑著,直接也把清理文件的機(jī)制也放到了這個類,指定要監(jiān)聽的目錄,指定最大的大小,每隔一段時間讀取下大小,超過了則清理早期的文件。

二、功能特點(diǎn)

2.1 軟件模塊

設(shè)備監(jiān)控模塊,包括數(shù)據(jù)監(jiān)控(表格形式展示)、設(shè)備面板(面板形式展示)、地圖監(jiān)控(地圖形式展示)、曲線監(jiān)控(曲線形式展示)。

數(shù)據(jù)查詢模塊,包括報(bào)警記錄、運(yùn)行記錄、操作記錄。

系統(tǒng)設(shè)置模塊,包括基本設(shè)置、端口管理、控制器管理、探測器管理、報(bào)警聯(lián)動、類型設(shè)置等。

其他設(shè)置模塊,包括用戶管理、地圖管理、位置調(diào)整、組態(tài)設(shè)計(jì)、設(shè)備調(diào)試等。

2.2 基礎(chǔ)功能

  1. 設(shè)備數(shù)據(jù)采集,支持串口、網(wǎng)絡(luò),串口可設(shè)置串口號、波特率,網(wǎng)絡(luò)可設(shè)置IP地址、通訊端口。
  2. 每個端口支持采集周期時間,默認(rèn)1秒鐘一個設(shè)備。
  3. 支持設(shè)置通訊超時次數(shù),默認(rèn)3次。
  4. 支持最大重連時間,用于重新讀取離線的設(shè)備。
  5. 控制器信息,能夠添加控制器名稱,選擇控制器地址、控制器型號,設(shè)置該控制器下面的探測器數(shù)量。
  6. 探測器信息,能夠添加位號、探測器型號、氣體種類、氣體符號、高報(bào)值、低報(bào)值、緩沖值、清零值、是否啟用、報(bào)警聲音、背景地圖、存儲周期、數(shù)值換算小數(shù)點(diǎn)位數(shù)、報(bào)警延時時間、報(bào)警的類型(HH,LL,HL)等。
  7. 類型管理可配置控制器型號、探測器型號、氣體種類、氣體符號等。
  8. 地圖支持導(dǎo)入和刪除,所有的探測器在地圖上的位置可自由拖動保存。
  9. 端口信息、控制器信息、探測器信息、類型信息、用戶信息等,都支持導(dǎo)入、導(dǎo)出、導(dǎo)出到excel、打印。
  10. 運(yùn)行記錄、報(bào)警記錄、操作記錄,都支持多條件組合查詢,比如時間段、控制器、探測器等,所有記錄支持導(dǎo)出到excel/pdf和打印。
  11. 運(yùn)行記錄、報(bào)警記錄、操作記錄都可刪除指定時間范圍內(nèi)的數(shù)據(jù)。
  12. 系統(tǒng)設(shè)置可選擇對應(yīng)表最大保存記錄數(shù),自動清理早期數(shù)據(jù),留出足夠的空間存儲重要的數(shù)據(jù)。
  13. 報(bào)警短信轉(zhuǎn)發(fā),支持多個接收手機(jī)號碼,可設(shè)定發(fā)送間隔,比如即時發(fā)送或者6個小時發(fā)送一次所有的報(bào)警信息,短信內(nèi)容過長,自動拆分多條短信。
  14. 報(bào)警郵件轉(zhuǎn)發(fā),支持多個接收郵箱,可設(shè)定發(fā)送間隔,比如即時發(fā)送或者6個小時發(fā)送一次所有的報(bào)警信息,支持附件發(fā)送。
  15. 設(shè)置軟件的中文標(biāo)題、英文標(biāo)題、logo路徑、版權(quán)所有等。
  16. 開關(guān)設(shè)置開機(jī)運(yùn)行、報(bào)警聲音、自動登錄、記住密碼等。
  17. 報(bào)警聲音可設(shè)置播放次數(shù),界面風(fēng)格樣式提供18套皮膚文件選擇。
  18. 用戶管理,包括用戶權(quán)限配置,不同用戶可以有不同模塊的權(quán)限。
  19. 用戶登錄和用戶退出,可以記住密碼和自動登錄,超過三次報(bào)錯提示并關(guān)閉程序。
  20. 四種監(jiān)控模式,設(shè)備面板監(jiān)控、地圖監(jiān)控、表格數(shù)據(jù)監(jiān)控、曲線數(shù)據(jù)監(jiān)控,可自由切換,四種模式下都實(shí)時展示采集到的數(shù)據(jù),報(bào)警閃爍等。
  21. 報(bào)警繼電器聯(lián)動,一個位號可以跨串口聯(lián)動多個模塊和繼電器號,支持多對多。

2.3 特色功能

  1. 通信協(xié)議支持modbus_com、modbus_tcp_rtu,后期拓展mqtt等協(xié)議。
  2. 數(shù)據(jù)源除了真實(shí)的硬件設(shè)備采集,還可選數(shù)據(jù)庫采集,這樣用戶可以安排其他程序員比如java程序員將前端采集好的數(shù)據(jù)放到數(shù)據(jù)庫,本系統(tǒng)直接從數(shù)據(jù)庫采集即可。數(shù)據(jù)庫采集模式可以作為通用的系統(tǒng)使用,更適合多人多系統(tǒng)協(xié)作。
  3. 智能跳過超時的設(shè)備,加快對在線設(shè)備的采集速度,當(dāng)設(shè)備數(shù)量很多的時候尤其有用。
  4. 對智能跳過的超時的設(shè)備,在設(shè)定的重連時間自動采集一次,以便探測設(shè)備是否又重新上線。
  5. 每個探測器可控是否啟用,不啟用則不會采集,也不會在界面顯示,相當(dāng)于運(yùn)行階段臨時關(guān)閉。
  6. 探測器可設(shè)置緩沖值和報(bào)警延時時間,在該值附近波動產(chǎn)生的報(bào)警,不計(jì)入報(bào)警,只有持續(xù)處于報(bào)警值且超過報(bào)警延時時間才算真正報(bào)警,這樣可以規(guī)避很多波動導(dǎo)致的誤報(bào)。
  7. 探測器可設(shè)置存儲周期,按照設(shè)定的時間來存儲一條運(yùn)行記錄,可以按照重要程度對重要性高的設(shè)定存儲周期短一些,不重要的設(shè)定大一些,這樣可以節(jié)省不少的存儲空間,也保證了重要的數(shù)據(jù)及時存儲。
  8. 探測器可設(shè)置清零值,在一些高精度高靈敏的設(shè)備可能出廠的時候默認(rèn)值未必是0,需要設(shè)定清零值來表示初始值。
  9. 探測器可設(shè)置小數(shù)點(diǎn),用于計(jì)算后的真實(shí)數(shù)據(jù)控制小數(shù)點(diǎn)點(diǎn)位顯示,相當(dāng)于除以10、除以100、除以1000,這樣大部分的探測器數(shù)據(jù)直接通過小數(shù)點(diǎn)位設(shè)置控制真實(shí)換算后的值,極個別的需要特殊轉(zhuǎn)換的可以在通信協(xié)議中約定。
  10. 探測器報(bào)警的類型支持多種,有些設(shè)備是高于某個值高報(bào),低于某個值低報(bào),而有些設(shè)備是在最小值最大值范圍內(nèi)是高報(bào),低于最小值低報(bào),高于最大值正常。這樣可以分情況處理,涵蓋各種報(bào)警類型。
  11. 原創(chuàng)數(shù)據(jù)導(dǎo)入、導(dǎo)出、打印機(jī)制,跨平臺不依賴任何組件,瞬間導(dǎo)出數(shù)據(jù)。
  12. 導(dǎo)出到excel的記錄支持所有excel、wps等表格文件版本,不依賴excel等軟件。
  13. 高報(bào)顏色、低報(bào)顏色、正常顏色、默認(rèn)值顏色等,都可以自由設(shè)置。
  14. 支持云端數(shù)據(jù)同步,將本地采集到的數(shù)據(jù)實(shí)時同步到云端。
  15. 支持網(wǎng)絡(luò)轉(zhuǎn)發(fā)和網(wǎng)絡(luò)接收,網(wǎng)絡(luò)接收開啟后,軟件從udp接收數(shù)據(jù)進(jìn)行解析。網(wǎng)絡(luò)轉(zhuǎn)發(fā)支持多個目標(biāo)IP,這樣就實(shí)現(xiàn)了本地采集的軟件,自由將數(shù)據(jù)轉(zhuǎn)到客戶端,隨時查看采集到的數(shù)據(jù)。
  16. 自動記住用戶最后停留的界面以及其他配置信息,重啟后自動應(yīng)用。
  17. 報(bào)警自動切換到對應(yīng)的地圖,探測器按鈕閃爍,表格數(shù)據(jù)對應(yīng)顏色顯示。
  18. 雙擊探測器圖標(biāo),彈出對應(yīng)探測器詳細(xì)信息,可以根據(jù)需要定制回控操作。
  19. 數(shù)據(jù)庫支持多種,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金倉等。
  20. 本地設(shè)備采集到的數(shù)據(jù)實(shí)時上傳到云端,以便手機(jī)APP或者web等其他方式提取。
  21. 自帶設(shè)備模擬工具,支持不同型號的多個設(shè)備數(shù)據(jù)模擬,同時還帶數(shù)據(jù)庫數(shù)據(jù)模擬,以便在沒有設(shè)備的時候測試數(shù)據(jù)。
  22. 標(biāo)準(zhǔn)modbus協(xié)議,各種控制器類型、探測器類型、種類、符號等全部自定義,非常靈活和強(qiáng)大,通信協(xié)議示例數(shù)據(jù)非常完整,通用各種modbus協(xié)議系統(tǒng),適用于各種應(yīng)用場景接入。
  23. 同時集成了串口通信、網(wǎng)絡(luò)通信、數(shù)據(jù)庫通信、數(shù)據(jù)導(dǎo)入導(dǎo)出打印、通信協(xié)議解析、界面UI、全局換膚等眾多組件和知識點(diǎn),非常適合新手入門和進(jìn)階。
  24. 支持xp、win7、win10、、win11、linux、mac、各種國產(chǎn)系統(tǒng)(UOS、中標(biāo)麒麟、銀河麒麟等)、嵌入式linux等系統(tǒng)。
  25. 注釋完整,項(xiàng)目結(jié)構(gòu)清晰,超級詳細(xì)完整的使用開發(fā)手冊,精確到每個代碼文件的功能說明,不斷持續(xù)迭代版本。

三、體驗(yàn)地址

國內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun

國際站點(diǎn):https://github.com/feiyangqingyun

體驗(yàn)地址:https://pan.baidu.com/s/1foas7ytSXh7gHOTDqDREjQ 提取碼:axip 文件名:bin_iotsystem.zip。

四、效果圖

五、相關(guān)代碼

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數(shù)據(jù)庫獲取記錄行數(shù)%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;
    }

    //首先查找總記錄數(shù),如果總記錄數(shù)超過限制,則將超出的部分按照字段排序進(jìn)行刪除
    int count = getCount();
    int cleanCount = (count - maxCount);
    if (cleanCount < 100) {
        return;
    }

    time.restart();

    //每次最大清理1000條數(shù)據(jù)
    cleanCount = cleanCount > 1000 ? 1000 : cleanCount;
    //將要刪除的數(shù)據(jù)指定字段集合查詢出來
    QStringList list = getCleanValue(cleanCount);
    if (list.count() == 0) {
        return;
    }

    //刪除數(shù)據(jù)
    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數(shù)據(jù)庫清理數(shù)據(jù)成功%2").arg(dbFlag).arg(msg));
    } else {
        QString text = database.lastError().text();
        emit error(QString("%1數(shù)據(jù)庫清理數(shù)據(jù)失敗%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();
        }

        //轉(zhuǎn)化成MB,超過預(yù)定大小自動刪除第一個文件夾,跳出循環(huán)無需繼續(xù)判斷
        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數(shù)據(jù)庫自動清理目錄成功%2").arg(dbFlag).arg(msg));
            break;
        }
    }
}

void DbCleanThread::deletePath(const QString &path)
{
    QDir dir(path);
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    //這個方法可以遞歸徹底刪除文件夾 不管文件夾下是否有文件 比較暴力
    //此方法慎用 必須指定明確的文件夾 不然刪除默認(rèn)的目錄哭都來不及 網(wǎng)上多個人中招
    dir.removeRecursively();
#else
    //循環(huán)遍歷刪除文件及文件夾
    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物聯(lián)網(wǎng)管理平臺之實(shí)現(xiàn)自動清理早期數(shù)據(jù)功能的詳細(xì)內(nèi)容,更多關(guān)于Qt自動清理數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文學(xué)會數(shù)據(jù)結(jié)構(gòu)-堆

    一文學(xué)會數(shù)據(jù)結(jié)構(gòu)-堆

    本文主要介紹了數(shù)據(jù)結(jié)構(gòu)-堆,文中通過圖片和大量的代碼講解的非常詳細(xì),需要學(xué)習(xí)的朋友可以參考下這篇文章,希望可以幫助到你
    2021-08-08
  • Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解

    Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解

    這篇文章主要介紹了Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置,CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺集成開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-08-08
  • C++實(shí)現(xiàn)順序表的常用操作(插入刪出查找輸出)

    C++實(shí)現(xiàn)順序表的常用操作(插入刪出查找輸出)

    實(shí)現(xiàn)順序表的插入,刪除,查找,輸出操作在C語言中經(jīng)常用到。下面小編給大家整理實(shí)現(xiàn)代碼,一起看下吧
    2016-08-08
  • C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題

    C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題

    這篇文章主要介紹了C++如何解決rand()函數(shù)生成的隨機(jī)數(shù)每次都一樣的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++或Go求矩陣?yán)锏膷u嶼的數(shù)量詳解

    C++或Go求矩陣?yán)锏膷u嶼的數(shù)量詳解

    這篇文章主要介紹了C++和go實(shí)現(xiàn)LeetCode(200.島嶼的數(shù)量),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++Node類Cartographer開始軌跡的處理深度詳解

    C++Node類Cartographer開始軌跡的處理深度詳解

    這篇文章主要介紹了C++Node類Cartographer開始軌跡的處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • c++虛函數(shù)與虛函數(shù)表原理

    c++虛函數(shù)與虛函數(shù)表原理

    這篇文章主要介紹了c++虛函數(shù)與虛函數(shù)表原理,用virtual?修飾的成員函數(shù)叫虛函數(shù),下面圍繞c++虛函數(shù)與虛函數(shù)得相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下
    2021-12-12
  • Qt定時器類QTimer使用詳解與注意事項(xiàng)

    Qt定時器類QTimer使用詳解與注意事項(xiàng)

    Qt提供了兩種定時器,一種是QObject類的定時器,另一種是QTimer類的定時器,這篇文章主要給大家介紹了關(guān)于Qt定時器類QTimer使用與注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • C語言完數(shù)的實(shí)現(xiàn)示例

    C語言完數(shù)的實(shí)現(xiàn)示例

    C語言中的完數(shù)指的是一個正整數(shù),本文主要介紹了C語言完數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C++實(shí)現(xiàn)控制臺隨機(jī)迷宮的示例代碼

    C++實(shí)現(xiàn)控制臺隨機(jī)迷宮的示例代碼

    本文主要介紹了C++實(shí)現(xiàn)控制臺隨機(jī)迷宮的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論