91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

QT多發線程進行數據傳輸

發布時間:2020-10-15 05:12:48 來源:網絡 閱讀:1196 作者:WZM3558862 欄目:開發技術

平時的項目程序中,經常需要處理多個串口和網絡發送過來的數據,而且數據量還比較大,9600的波特率每秒鐘至少1000個字節的數據需要處理并反映到界面上,一開始直接和UI主線程同一個線程,在x86的機器上跑還沒問題,畢竟X86的機器最少主頻也不會低于1.6G,但是如果數據量再更大或者到了ARM上跑,直接UI卡住不動,想到的解決辦法就是用多線程,一個線程負責收數據,一個線程負責處理數據,當協議一樣的時候,如果需要將數據解析從串口改為網絡端口監聽的數據,以前的辦法是重新寫一個tcp通信進行處理,這個并不是非常合理的辦法,畢竟解析協議是一樣的,所以自己總結了一個通用的數據處理思路:各種數據接收后排隊的形式存入一個全局變量,單獨開辟一個線程從這個全局變量中讀取第一個數據,處理完則移除第一個數據,Qt中的鏈表直接提供了一個takeFirst函數,用起來非常爽!用while循環讀取,在讀取的時候加鎖,這樣的話就不會沖突了。
雛形:
全局變量文件

復制代碼

  1. #ifndef APP_H

  2. #define APP_H


  3. #include "qstring.h"

  4. #include "qstringlist.h"


  5. class App

  6. {

  7. public:    

  8.     static QStringList list;


  9. };


  10. #endif // APP_H


復制代碼

  1. #include "app.h"


  2. QStringList App::list=QStringList();


獨立處理數據線程:

復制代碼

  1. #ifndef TEST_H

  2. #define TEST_H


  3. #include "qthread.h"

  4. #include "qmutex.h"


  5. class Thread : public QThread

  6. {

  7.     Q_OBJECT

  8. public:

  9.     Thread();

  10.     ~Thread();


  11.     void stop();


  12. protected:

  13.     void run();


  14. private:

  15.     QMutex mutex;

  16.     volatile bool stopped;


  17. signals:

  18.     void readOne(QString txt);


  19. };


  20. #endif // TEST_H


復制代碼

  1. #include "thread.h"

  2. #include "app.h"


  3. Thread::Thread()

  4. {

  5. stopped=false;

  6. }


  7. Thread::~Thread()

  8. {


  9. }


  10. void Thread::stop()

  11. {

  12.     stopped=true;

  13. }


  14. void Thread::run()

  15. {

  16.     while(!stopped){

  17.         mutex.lock();

  18.         if (App::list.count()>0){            

  19.             QString txt=App::list.takeFirst();

  20.             emit readOne(txt);

  21.         }

  22.         mutex.unlock();

  23.         msleep(1);//不加這句CPU占用率高達50%

  24.     }

  25.     stopped=false;

  26. }


主界面:

復制代碼

  1. #ifndef WIDGET_H

  2. #define WIDGET_H


  3. #include <QWidget>

  4. #include "thread.h"

  5. #include "qtimer.h"


  6. namespace Ui {

  7. class frmMain;

  8. }


  9. class frmMain : public QWidget

  10. {

  11.     Q_OBJECT


  12. public:

  13.     explicit frmMain(QWidget *parent = 0);

  14.     ~frmMain();


  15. private slots:

  16.     void writeOne();

  17.     void readOne(QString txt);

  18.     void on_btnAppend_clicked();

  19.     void on_btnThread_clicked();

  20.     void on_btnTimer_clicked();


  21. private:

  22.     Ui::frmMain *ui;


  23.     QTimer *timer;

  24.     Thread *thread;


  25. };


  26. #endif // WIDGET_H


復制代碼

  1. #include "frmmain.h"

  2. #include "ui_frmmain.h"

  3. #include "app.h"

  4. #include "qdatetime.h"

  5. #include "qdesktopwidget.h"


  6. #define _TIME_ qPrintable (QTime::currentTime().toString("now : hh:mm:ss:zzz"))


  7. frmMain::frmMain(QWidget *parent) :

  8.     QWidget(parent),

  9.     ui(new Ui::frmMain)

  10. {

  11.     ui->setupUi(this);


  12.     this->showMaximized();


  13.     timer=new QTimer(this);

  14.     timer->setInterval(50);

  15.     connect(timer,SIGNAL(timeout()),this,SLOT(writeOne()));


  16.     thread=new Thread;

  17.     connect(thread,SIGNAL(readOne(QString)),this,SLOT(readOne(QString)));

  18. }


  19. frmMain::~frmMain()

  20. {

  21.     delete ui;

  22. }


  23. void frmMain::writeOne()

  24. {

  25.     App::list.append(_TIME_);

  26. }


  27. void frmMain::readOne(QString txt)

  28. {

  29.     ui->txtOut->append(txt);

  30. }


  31. void frmMain::on_btnAppend_clicked()

  32. {

  33.     App::list.append(ui->txtIn->text());

  34. }


  35. void frmMain::on_btnThread_clicked()

  36. {

  37.     if (ui->btnThread->text()=="start thread"){

  38.         thread->start();

  39.         ui->btnThread->setText("stop thread");

  40.         ui->txtOut->append("start thread ok");

  41.     }else{

  42.         thread->stop();

  43.         ui->btnThread->setText("start thread");

  44.         ui->txtOut->append("stop thread ok");

  45.     }

  46. }


  47. void frmMain::on_btnTimer_clicked()

  48. {

  49.     if (ui->btnTimer->text()=="start timer"){

  50.         timer->start();

  51.         ui->btnTimer->setText("stop timer");

  52.         ui->txtOut->append("start timer ok");

  53.     }else{

  54.         timer->stop();

  55.         ui->btnTimer->setText("start timer");

  56.         ui->txtOut->append("stop timer ok");

  57.     }

  58. }


為了模擬大量數據,我這里開了50毫秒的定時器定時產生當前時間字符串的數據存入全局變量,然后放置了幾個按鈕用于手動添加字符串和開始停止線程及定時器。
QT多發線程進行數據傳輸


歡迎提出批評建議以及指點!謝謝!


向AI問一下細節

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

qt
AI

洛扎县| 调兵山市| 盐边县| 芒康县| 马山县| 怀化市| 济源市| 阿鲁科尔沁旗| 丽水市| 武胜县| 滦平县| 连州市| 徐州市| 资中县| 都兰县| 团风县| 萨迦县| 泽州县| 长兴县| 林口县| 孝感市| 攀枝花市| 玉门市| 铜川市| 临洮县| 思茅市| 沙坪坝区| 合作市| 天峻县| 澄城县| 荣昌县| 富民县| 梅州市| 漳平市| 青铜峡市| 湄潭县| 于都县| 陵川县| 犍为县| 江源县| 师宗县|