🎩 歡迎來到技術探索的奇幻世界👨?💻
📜 個人主頁:@一倫明悅-CSDN博客
?🏻 作者簡介:?C++軟件開發、Python機器學習愛好者
🗣??互動與支持:💬評論?? ? ?👍🏻點贊?? ? ?📂收藏?? ? 👀關注+
如果文章有所幫助,歡迎留下您寶貴的評論,點贊加收藏支持我,點擊關注,一起進步!
機緣
? ? ? ? 不知不覺已經到了第一個創作紀念日,從2021年7月加入CSDN直到2023年9月1日開始書寫第一篇博客,中間經歷了研究生兩年的生活,在研究生學習過程中,需要學習的內容越來越多,有時候很讓人力不從心,并且做的很多項目也積累了不少經驗,想要將這些分享給大家,希望能帶來一些幫助,這就是寫博客的初心,初心源于對技術和知識的熱愛,也可能源于對實踐經驗的渴望。????????
????????在實戰項目中的經驗分享中,我在解決問題、應對挑戰的過程中開始思考、總結并記錄下來,逐漸形成了寫作的動力。日常學習過程中的記錄則是將學到的知識整理輸出,不僅可以加深對知識的理解,也能夠與他人分享交流,從中獲得更多的反饋和啟發。通過文章進行技術交流則是作者展示自己對特定技術領域的理解和見解,與其他技術人員交流討論,共同探討問題并找到解決方案。
????????下面是一些進行寫作的主要原因:
? ? ?(1)來自于實戰項目中的經驗分享:
????????在實戰項目中積累的很多經驗包括在實際項目中遇到的問題、解決方案以及經驗教訓,可以幫助他人更好地理解和應對類似的挑戰。這種分享不僅可以加深自身對問題的理解,還可以為其他人提供寶貴的參考和指導。
? ? ? ? 在分享實戰項目中的經驗時,我會詳細描述項目的背景和目標,介紹遇到的具體問題或挑戰,并說明解決問題的思路和方法。分享自己在解決問題過程中的思考過程、遇到的困難以及如何克服困難的實際操作步驟。同時,還會分享在解決問題中學到的經驗教訓,以及后續改進的方向和建議。
????????通過詳細地分享實戰項目中的經驗,讀者可以從中汲取寶貴的經驗和教訓,避免踩坑,提高解決問題的效率和質量。這種分享可以促進技術交流和共同進步。
? ? ?(2)日常學習過程中的記錄:
????????寫博客的另一個原因是日常學習過程中的記錄需要是一種非常有益的習慣。通過將自己的學習成果、心得體會以及解決問題的經驗記錄在博客中,不僅可以加深對知識的理解,還能夠幫助自己系統地整理和歸納所學內容。
????????首先,記錄學習過程中的點滴細節和收獲可以幫助自己形成學習的閉環。通過不斷地總結、整理和輸出,可以加深對知識的理解,幫助記憶并鞏固所學內容。此外,通過寫作的方式,還能夠培養自己的思維邏輯能力和表達能力,提高文字表達的水平。
????????其次,通過在博客中記錄學習過程中的內容,還可以與他人分享和交流。其他讀者可以從中獲得啟發、指導或解決問題的思路,形成技術共享和交流的平臺。同時,讀者的反饋和評論也能夠幫助作者不斷改進和提升,促進共同進步。
????????此外,通過博客記錄學習過程還可以留下自己的學習足跡和思考軌跡。隨著時間的推移,可以回顧自己曾經的學習歷程和成長經歷,看到自己的進步和成就,激勵自己繼續前行。
????????因此,寫博客為了日常學習過程中的記錄需要不僅有助于個人學習成長,還可以為他人提供有益的信息和啟發,促進技術的傳播和交流。這種分享精神不僅可以幫助自己成長,也可以造福他人,實現共贏的局面。
? ? ?(3)通過文章進行技術交流:
? ? ? ? 還有最重要的一點是通過文章進行技術交流,包括撰寫技術性文章,分享自己在特定領域的見解、經驗和解決問題的方法,與其他技術人員進行深入的交流和探討。這種方式不僅可以展示作者的專業知識和技術水平,還能夠促進技術領域的交流和共同進步。
????????首先,通過文章進行技術交流可以展示專業知識和見解。可以通過分享自己在特定技術領域的研究成果、實踐經驗或者對技術發展的思考,向讀者展示自己的專業素養和深度。
????????其次,通過文章進行技術交流可以促進技術領域的交流和共享。其他技術人員可以通過閱讀我的文章,了解到研究成果和經驗教訓,從中獲得啟發和指導。同時,讀者還可以通過評論和反饋的方式與其進行互動,提出問題、分享見解,共同探討技術問題并找到解決方案。
????????此外,通過文章進行技術交流還可以推動技術領域的進步和發展。可以通過分享自己的技術創新和解決方案,為技術領域的發展貢獻自己的力量。同時,通過與其他技術人員的交流和合作,可以促進技術的傳播和應用,推動技術領域的不斷創新和進步。
收獲
????????在創作過程中可能會有很多種收獲,這些收獲不僅體現在數字指標上,還包括對自身成長和社交網絡的積極影響。截至目前為止,共寫出48篇原創文章。
????????粉絲關注:
????????通過博客的創作,我會吸引到一批粉絲或讀者群體。目前為止,粉絲共有642人,鐵粉共有25人,這些粉絲可能會定期關注博客更新,或者通過社交媒體分享你的內容,從而擴大影響力和知名度。粉絲的關注不僅可以提升在網絡上的影響力,還能夠激勵持續創作和分享有價值的內容。
????????正向反饋:
????????當文章受到讀者的歡迎時,會帶來各種形式的正向反饋,比如贊、評論、轉發和閱讀量增加等。共獲得點贊815次,收藏652次,積極評論141次,這些反饋不僅是努力的肯定,還能夠幫助更好地了解讀者的需求和興趣,指導未來的創作方向。
????????認識同行:
????????通過博客的創作,我也結識到許多志同道合的領域同行。這些同行可能是在同一領域從事相關工作或有相似興趣愛好的人。與他們的交流和互動不僅可以拓展我的人際網絡,還能夠獲得來自不同角度的觀點和建議,促進彼此的成長和學習。有時候,這些同行還可能成為未來的合作伙伴或者良師益友,共同探索和解決技術領域的問題。
????????知識和技能提升:
????????創作博客需要對所寫內容進行深入的思考和研究,這會促使不斷地學習和提升自己的知識和技能。在寫作的過程中,可能會遇到各種問題和挑戰,需要去查閱資料、學習新知識,從而拓展自己的視野和認知。這種持續學習和成長的過程,會使自己不斷地進步和提升,成為更優秀的技術人員。
????????總的來說,博客創作的收獲遠不止于數字指標,它還包括對自身技術能力和專業素養的提升,對社交網絡的擴展和深化,以及對行業內同行的認識和交流。這些收獲都是在個人成長和職業發展過程中非常寶貴的。
日常
????????當前,創作已經成為我的生活中不可或缺的一部分,與我的工作和學習密切相關。
????????首先,創作已經融入了我的日常工作和學習中。作為一個寫作愛好者和技術從業者,我常常利用業余時間來創作博客文章,記錄自己的學習心得、技術經驗和思考。這些創作不僅是對我個人學習過程的總結和反思,也是對我所從事領域的探索和分享。因此,創作已經成為我學習過程中的一種延伸和補充,有助于我更加深入地理解和應用所學知識。
????????其次,對于如何平衡創作、工作和學習,我采取了一些策略來保持良好的平衡。首先,我會合理規劃時間,將工作、學習和創作合理分配在每天的時間段中,避免出現過度投入其中一項而忽略其他。其次,我注重高效學習和工作,提高任務完成的效率,以騰出更多時間用于創作。此外,我也會不斷調整和優化自己的工作和學習計劃,根據實際情況調整創作的時間和內容,保持整體的平衡和穩定。
????????總的來說,創作已經成為我生活的一部分,與工作和學習相互交織、相互促進。通過合理規劃和管理時間,我能夠保持良好的平衡,充分發揮創作在我的學習和工作中的作用,不斷提升自己的能力和影響力。
成就
過去寫得最好的一段代碼是在一個大型項目中,里面的代碼詳細內容位于這篇博客中[C++ QT項目實戰]----C++ QT系統實現多線程通信-CSDN博客?這里將主要代碼塊篩選出來如下:
系統多線程實現
? ? ? ? 這里講解四個實現函數文件,其實是兩個文件:mainwindow.h和mainwindow.cpp文件為主線程文件,Zanj_WFC_ctrl.h和Zanj_WFC_ctrl.cpp文件為子線程文件,下面一一解釋。
? ? ? ? mainwindow.cpp文件
? ? ? ? (1)、該文件用于實現顯示主線程中的主界面,也就是運行之后,第一個界面,可以在界面上進行操作,后臺信息是由于spdlog日志信息的導入,才會進行信息顯示,便于觀察,#include "spdlog/spdlog.h",代碼中下面這一部分就是建立子線程的核心,QT中可以使用moveToThread()函數建立新線程。具體介紹如下:
????????a、m_Zanj_WFC_ctrl = new Zanj_WFC_ctrl;// 這個實例要負責預報計算任務
????????b、m_Zanj_WFC_ctrl_Thread = new QThread; // 子線程,本身不負責預報計算
????????c、connectZanj_WFC_ctrl(m_Zanj_WFC_ctrl); // 連接信號-槽,復制的開始和取消指令是通過信號發送的
????????d、m_Zanj_WFC_ctrl->moveToThread(m_Zanj_WFC_ctrl_Thread);// 將實例移動到新的線程,實現多線程運行
????????e、m_Zanj_WFC_ctrl_Thread->start();
? ? ? ? (2)、函數connectZanj_WFC_ctrl()用于連接子線程函數,里面有該函數實現的功能,使用connect()函數編寫代碼:?connect(this, SIGNAL(system_predict_init_link()), m_Zanj_WFC_ctrl, SLOT(HDGL_SYSTEM_Init()));這個函數HDGL_SYSTEM_Init()在子線程中實現,也就是說只要主線程啟動,子線程也會跟著啟動,可以在該函數中實現子線程的功能。
????????(3)、上述描述的主線程與子線程通信的案例中的實現過程如下:也是通過信號與槽函數方式,比如打開配置文件函數,首先對該函數進行實現on_Open_config_Btn_clicked(),該函數就是打開配置文件控件對應的函數,該函數實現了點擊按鈕之后,發送了信號emit send_config();該信號通過connect()函數發送到子線程,代碼為connect(this, &MainWindow::send_config, m_Zanj_WFC_ctrl, &Zanj_WFC_ctrl::OnconfigSlot);OnconfigSlot()函數在子線程中實現。
????????原理就是這樣,雖有些繁瑣,但是邏輯性強。另一個讀取數據按鈕原理一樣。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "Zanj_WFC_ctrl.h"
#include "qdebug.h"
#include <qstring.h>#include "cglobal.h"
#include <QElapsedTimer>
#include <iostream>
#include "windows.h"
#pragma comment(lib,".\\lib\\fmtd.lib")#include "spdlog/fmt/ostr.h"
#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/rotating_file_sink.h"#include <QTimer>
#include <time.h>
#include <QLabel>
#include <QValueAxis>
#include <QMargins>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>#include <ctime> using namespace std::literals;
using namespace std;
namespace spd = spdlog;
auto console_mainWindow = spd::stdout_color_mt("主界面控制臺");
auto rotating_logger_mainWindow = spdlog::rotating_logger_mt("CAO8_Winmain_rotating", "logs/CAO8_rotating.logger", 1048576 * 5, 12);MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle(QString::fromLocal8Bit("主系統")); // 此處寫應用程序在標題欄上顯示的名稱setStyleSheet("background - color:pink; ");reshow();data_log_tblview();console_mainWindow->info("歡迎進入主系統UI線程[Mainwindow]!");rotating_logger_mainWindow->info("歡迎進入主系統UI線程[Mainwindow]!");m_Zanj_WFC_ctrl = new Zanj_WFC_ctrl;// 這個實例要負責預報計算任務m_Zanj_WFC_ctrl_Thread = new QThread; // 子線程,本身不負責預報計算connectZanj_WFC_ctrl(m_Zanj_WFC_ctrl); // 連接信號-槽,復制的開始和取消指令是通過信號發送的m_Zanj_WFC_ctrl->moveToThread(m_Zanj_WFC_ctrl_Thread);// 將實例移動到新的線程,實現多線程運行m_Zanj_WFC_ctrl_Thread->start();emit system_predict_init_link();// 向子線程發送打開配置文件信息connect(this, &MainWindow::send_config, m_Zanj_WFC_ctrl, &Zanj_WFC_ctrl::OnconfigSlot);// 向子線程發送讀取數據信號,子線程接收后,進行數據讀取connect(this, &MainWindow::send_rChk_ToWFC, m_Zanj_WFC_ctrl, &Zanj_WFC_ctrl::OnGETSlot);}MainWindow::~MainWindow()
{delete ui;
}// 這里連接子線程,進行子線程的開啟,子線程連接數據庫,連接大數據平臺,打開所需文件的信號傳遞,以及MainWindow界面槽函數處理信號的實現
void MainWindow::connectZanj_WFC_ctrl(Zanj_WFC_ctrl * m_Zanj_WFC_ctrl)
{connect(this, SIGNAL(system_predict_init_link()), m_Zanj_WFC_ctrl, SLOT(HDGL_SYSTEM_Init()));// 使用信號-槽機制,發出開始指令}// 打開配置文件函數
void MainWindow::on_Open_config_Btn_clicked()
{ui->Iplate4j_IP_QLE->setText("127.0.0.1");ui->model_PC_IP_QLE->setText("127.0.0.1");emit send_config();
}// 由主窗口發送數據讀取信號,子線程實現數據讀取操作
void MainWindow::on_Restful_data_read_Btn_clicked()
{emit send_rChk_ToWFC();}
????????mainwindow.h文件
????????該文件就是.cpp文件中眾多函數的聲明,以及信號的聲明,比如讀取數據時發送的信號需要在這里聲明一下,便于使用。Zanj_WFC_ctrl * m_Zanj_WFC_ctrl; // 預報計算的類
?? ?QThread * m_Zanj_WFC_ctrl_Thread; //將被移動到此線程執行,這里也定義了指針,用于在.cpp文件中使用。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include"ui_mainwindow.h"
#include <QMainWindow>
#include <QLabel>
#include <QtSql/QtSql>#include "spdlog/fmt/ostr.h"
#include "Zanj_WFC_ctrl.h"
#include <QVariant>
#include "wfc_to_main.h"#include <QtSql/QtSql>
#include <QDateTime>
#include <QTimer>
#include <qtextcodec.h>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>#include <QMouseEvent>
//一定要聲明!!!
#include"dialog_data_log.h"
//#include<vector>//#include "dialog_data_log.h"
namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();Zanj_WFC_ctrl * m_Zanj_WFC_ctrl; // 預報計算的類QThread * m_Zanj_WFC_ctrl_Thread; //m_Mp_Pred將被移動到此線程執行void connectZanj_WFC_ctrl(Zanj_WFC_ctrl *m_Zanj_WFC_ctrl);private slots :void on_Restful_data_read_Btn_clicked(); //點擊平臺數據讀取按鈕,實現讀取數據信號發送 void on_Open_config_Btn_clicked();signals:void system_predict_init_link();//定義向子線程發送的信號,用于實現子線程開啟void send_config(); // 定義向子線程發送打開配置文件的信號void send_rChk_ToWFC(); // 定義向子線程發送數據讀取的信號private:Ui::MainWindow *ui;QLabel * pLabel;};#endif // MAINWINDOW_H
????????Zanj_WFC_ctrl.cpp文件
????????(1)、該文件中的眾多函數就是對主線程發送的信號的實現過程,當接受到主線程的信號之后,如果需要對其進行處理,便可以在這里定義函數實現過程,該HDGL_SYSTEM_Init()函數就是對主線程中connectZanj_WFC_ctrl()連接函數的實現。
?????????(2)、案例中主線程發送讀取數據信號,子線程中函數的實現OnGETSlot()在該文件中,這里適用于讀取數據函數的實現,可以根據需要進行修改。打開配置文件的實現原理與之一致。
#include "Zanj_WFC_ctrl.h"
#include "wfc_to_main.h"
#include <Python.h>
#include "qdebug.h"
#include <qstring.h>
#include <Python.h>#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmat.lib")
#pragma comment(lib,"mclmcr.lib")
#pragma comment(lib,".\\lib\\CGL_Mech_Property_BP_pred.lib")
#pragma comment(lib,".\\lib\\fmtd.lib")#include <QAxObject>
#include <QStandardPaths>
#include <QEventLoop>
#include <QDesktopWidget>#include <algorithm>
#include <numeric>
#include <vector>
#include <QVector>
#include <stdlib.h>#include "spdlog/fmt/ostr.h"
#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/rotating_file_sink.h"using namespace libxl;
using namespace std::literals;
//using namespace fmt;
using namespace std;
namespace spd = spdlog;
auto console_WFC_thread = spd::stdout_color_mt("WFC計算線程 ");
auto rlogger_WFC_thread = spdlog::rotating_logger_mt("CAO8_WFC_thread_rotating", "logs/CAO8_rotating.logger", 1048576 * 5, 12);int Zanj_WFC_ctrl::HDGL_SYSTEM_Init()
{rlogger_WFC_thread->flush_on(spd::level::debug);console_WFC_thread->info("歡迎進入主系統計算線程");str_info = QString::fromLocal8Bit("0 應用程序環境路徑 ") + path_deploy;return 1;
}void Zanj_WFC_ctrl::OnGETSlot()
{QString strMessage;QString strResult;QString strUrl;QString strInput;QFile file(QApplication::applicationDirPath() + "/1.json");if (!file.open(QIODevice::WriteOnly)) {console_WFC_thread->error("Json file open failed! ");rlogger_WFC_thread->error("Json file open failed! ");}else {console_WFC_thread->info("Json file open successfully! ");rlogger_WFC_thread->info("Json File open successfully! ");}//QString strInput = ui.textEdit_input->toPlainText();//strUrl += "http://" + ui.lineEdit_Url->text();strUrl = serverIP + serviceID_get;strInput = clientSecret;SendAndGetText(strUrl, get1, strInput, strMessage, strResult);QJsonParseError jsonError;QByteArray byteResult = strResult.toUtf8();//QString轉QByteArray//QJsonDocument json = QJsonDocument::fromJson(byteResult, &jsonError);json_doc_get = QJsonDocument::fromJson(byteResult, &jsonError);if (json_doc_get.isNull()){console_WFC_thread->critical("json文件為空文檔");//console->critical("jsonError錯誤類型" + jsonError.errorString().toStdString());//qDebug() << jsonError.errorString();rlogger_WFC_thread->critical("json格式錯誤[json_doc_get_slot]");//qDebug() << "json格式錯誤";//注意:如果文檔中有中文,就會報格式錯誤}else if (jsonError.error != QJsonParseError::NoError){console_WFC_thread->critical("json格式錯誤[json_doc_get_slot]" + jsonError.errorString().toStdString());//qDebug() << jsonError.errorString();rlogger_WFC_thread->critical("json格式錯誤[json_doc_get_slot]");}else {if (json_doc_get.isObject()) {doc_get_Obj = json_doc_get.object();}}json_doc_get_parse();
// RT_Iplat4j_Communication(); //放在這里可以在主窗口點擊數據讀取按鈕之后,才會提示是否數據平臺連接成功file.write(json_doc_get.toJson(QJsonDocument::Indented)); //Indented:表示自動添加/n回車符file.close();}void Zanj_WFC_ctrl::OnconfigSlot()
{configuration_read();
}
?????????Zanj_WFC_ctrl.h文件
????????該文件也是.cpp文件中眾多函數的聲明,比如處理讀取數據時發送的信號的函數需要在這里聲明一下,便于使用。
#pragma once#include <QObject>
#include <QtSql/QtSql>
#include <QVariant>//#include <connection.h>
//#include <QSql>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QMessageBox>
#include <QEventLoop>
#include <qstring.h>
#include <string>
#include "snap7.h"
#include <QtCore/QJsonObject>
#include <QtCore/QJsonDocument>
#include <Python.h>class Zanj_WFC_ctrl : public QObject
{Q_OBJECTpublic:Zanj_WFC_ctrl(QObject *parent=0);~Zanj_WFC_ctrl();public slots:int HDGL_SYSTEM_Init();void OnGETSlot();void OnconfigSlot();
憧憬
????????基于以上內容,我的憧憬主要涉及職業規劃和創作規劃兩個方面。
????????職業規劃:
????????基于我對技術領域的熱愛和專業知識的積累,我希望在未來能夠在技術領域取得更進一步的發展。我憧憬能夠成為該領域的專家或領軍人物,為行業發展和創新做出積極貢獻。
????????我希望能夠在職業生涯中不斷學習和成長,掌握更多先進的技術和方法,拓展自己的技能樹,并通過實際項目和研究實踐將所學知識轉化為實際成果。
????????我也期待能夠在職業發展的過程中,不斷挑戰自我,突破自己的局限,不斷追求卓越,成為行業內的領軍人物和創新者。
????????創作規劃:
????????在創作方面,我希望能夠繼續堅持不懈地寫作,并保持高質量和高頻率的創作輸出。我憧憬能夠建立起自己在技術領域的個人品牌和影響力,成為該領域的權威人士之一。
????????我計劃通過持續不斷地創作優質內容,吸引更多的讀者和粉絲,建立起自己的讀者群體,并與他們建立起良好的互動和交流關系,從而形成一個活躍的社區。
????????同時,我也希望通過創作來推動技術領域的發展和進步,分享自己的經驗和見解,促進技術領域的交流和合作,共同推動行業的發展。
????????我的憧憬是在未來的職業生涯中不斷成長和進步,在技術領域取得更多的成就和影響力,并通過持續不斷的創作來實現個人價值和行業貢獻。