中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

QT多發(fā)線程進(jìn)行數(shù)據(jù)傳輸-創(chuàng)新互聯(lián)

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

在琿春等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè),琿春網(wǎng)站建設(shè)費(fèi)用合理。

復(fù)制代碼

  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

復(fù)制代碼

  1. #include "app.h"

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

獨(dú)立處理數(shù)據(jù)線程:

復(fù)制代碼

  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

復(fù)制代碼

  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占用率高達(dá)50%

  24.     }

  25.     stopped=false;

  26. }

主界面:

復(fù)制代碼

  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

復(fù)制代碼

  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. }

為了模擬大量數(shù)據(jù),我這里開(kāi)了50毫秒的定時(shí)器定時(shí)產(chǎn)生當(dāng)前時(shí)間字符串的數(shù)據(jù)存入全局變量,然后放置了幾個(gè)按鈕用于手動(dòng)添加字符串和開(kāi)始停止線程及定時(shí)器。
QT多發(fā)線程進(jìn)行數(shù)據(jù)傳輸

歡迎提出批評(píng)建議以及指點(diǎn)!謝謝!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:QT多發(fā)線程進(jìn)行數(shù)據(jù)傳輸-創(chuàng)新互聯(lián)
文章路徑:http://www.rwnh.cn/article20/jdhco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)虛擬主機(jī)、App開(kāi)發(fā)響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
紫阳县| 双辽市| 赫章县| 武宁县| 梨树县| 嘉荫县| 霍林郭勒市| 平江县| 扎赉特旗| 奈曼旗| 内黄县| 榆中县| 高尔夫| 双辽市| 习水县| 杨浦区| 石棉县| 长兴县| 南川市| 庆云县| 灵山县| 巩留县| 天柱县| 安塞县| 新绛县| 大新县| 灵石县| 商洛市| 叶城县| 石门县| 南城县| 大同市| 古田县| 盐城市| 临武县| 三门县| 道孚县| 五台县| 安康市| 云南省| 安国市|