在通信中,往往会遇到这样的情况

当接入N个子结点,每个子结点向它的父结点发数据,父节点来并发处理总子结点汇集的数据。

对于上述情况,我们经常设计成多线程来并发接收数据,将数据接收后排队存入一个全局变量,再单独开辟一个线程从这个全局变量读取第一个数据,处理完则移除第一个数据。Qt中的链表直接提供了一个takeFirst函数,用while循环读取,在读取的时候加锁,这样的话就不会冲突了。

在这里我们设计了一个定时器来模拟子结点产生的数据,开辟一个单独的线程来读取数据。

关键代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "qtimer.h"
#include "thread.h"
#include "app.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTimer *timer;Thread *thread;private slots:void writeOne();void readOne(QString txt);void on_btnTimer_clicked();void on_btnThread_clicked();void on_btnAppend_clicked();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QTimer>#include "qdatetime.h"
#define _TIME_ qPrintable (QTime::currentTime().toString("now : hh:mm:ss:zzzz"))MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("并发数据处理的简单举例");timer =  new QTimer(this);timer->setInterval(50);connect(timer,SIGNAL(timeout()),this,SLOT(writeOne()));thread = new Thread;connect(thread,SIGNAL(readOne(QString)),this,SLOT(readOne(QString)));}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btnTimer_clicked()
{if (ui->btnTimer->text()=="start timer"){timer->start();ui->btnTimer->setText("stop timer");ui->txtOut->append("start timer ok");}else{timer->stop();ui->btnTimer->setText("start timer");ui->txtOut->append("stop timer ok");}}void MainWindow::on_btnThread_clicked()
{if (ui->btnThread->text()=="start thread"){thread->start();ui->btnThread->setText("stop thread");ui->txtOut->append("start thread ok");}else{thread->stop();ui->btnThread->setText("start thread");ui->txtOut->append("stop thread ok");}}void MainWindow::on_btnAppend_clicked()
{App::list.append(ui->lineEdit->text());
}void MainWindow::writeOne()
{App::list.append(_TIME_);
}
void MainWindow::readOne(QString txt)
{ui->txtOut->append(txt);
}
#ifndef THREAD_H
#define THREAD_H
#include "qthread.h"
#include "qmutex.h"
#include "app.h"class Thread:public QThread
{Q_OBJECT
public:Thread();~Thread();void stop();
protected:void run();
private:QMutex mutex;volatile bool stopped;
signals:void readOne(QString txt);
};#endif // THREAD_H
#include "thread.h"
//#include "app.h"extern  QList<QString> list;Thread::Thread()
{stopped = false;
}Thread::~Thread()
{}void Thread::stop()
{stopped = true;
}void Thread::run()
{while(!stopped){mutex.lock();if(App::list.count()>0){QString txt = App::list.takeFirst();emit readOne(txt);}mutex.unlock();msleep(1);}stopped = false;
}
#ifndef APP_H
#define APP_H#include<QList>class App{public:static  QList<QString> list;};QList<QString> App::list = QList<QString>();#endif // APP_H

参考文章:

https://blog.csdn.net/xu1129005165/article/details/81702924

Qt多线程示例--并发数据处理相关推荐

  1. Qt多线程编程(一)入门篇

    目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...

  2. Qt 多线程基础及线程使用方式

    文章目录 Qt 多线程操作 2.线程类QThread 3.多线程使用:方式一 4.多线程使用:方式二 5.Qt 线程池的使用 Qt 多线程操作 应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一 ...

  3. 【Qt】Qt多线程开发—实现多线程设计的四种方法

    Qt-使用Qt实现多线程设计的四种方法 文章目录 Qt-使用Qt实现多线程设计的四种方法 一.写在前面 二.[方法一] QThread:带有可选事件循环的底层API 三.[方法二] QThreadPo ...

  4. Qt多线程的几种实现方式

    Qt多线程的几种实现方式 在Qt中经常会遇到耗时操作,需要并发执行,这个时候就要用到多线程.Qt的多线程有多种实现形式,这里介绍3种方式. 类实现形式 用类实现多线程是最传统的实现形式,思想是写一个继 ...

  5. php curl 模拟多线程,php利用curl 多线程 模拟 并发的详解

    php利用curl 多线程 模拟 并发的详解 发布于 2014-12-07 10:17:25 | 265 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypert ...

  6. JAVA多线程和并发基础面试题

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观 ...

  7. java多线程示例_Java线程示例

    java多线程示例 Welcome to the Java Thread Example. Process and Thread are two basic units of execution. C ...

  8. java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题

    假设你有三个线程T1,T2,T3.你如何能保证线程T2在线程T1后运行,T3在T2后运行 这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对"joi ...

  9. Qt多线程之继承QObject(moveToThread方式)

    Qt多线程有两两种方式,第一种继承QThread,复写run()函数,但是run()和main()类似,run()函数才是子线程的入口函数,所以在设计到类的操作时,必须把对象或者指针放在run函数里面 ...

最新文章

  1. ASP.NET存取图片到数据库
  2. 我的360破解考题答案
  3. http://www.easyui.info/archives/396.html
  4. MySQL_管理与维护
  5. python 持续集成_使用jenkins和Gitlab进行Python项目的持续集成
  6. CSS3学习笔记(3)—左右飞入的文字
  7. 数据库大作业-学生宿舍管理系统
  8. 安装maya过程记录
  9. matlab 空间向量的夹角,空间两向量之间的旋转角如何求?角度范围在0-360°
  10. ubuntu服务器基本安全配置
  11. 关于Kris最近发布的SlidingMenu的兼容问题
  12. 金蝶显示服务器许可,金蝶K3服务器分配许可数已经全部使用,无法建立新的连接怎么办...
  13. c语言余弦定理float,余弦相似度公式
  14. linux下限制每个IP网速
  15. 基于java eclipse+jsp+mysql+servlet+Spring的学生信息管理系统基础版
  16. 计算机英语五人对话,英文应聘对话5人的急求一篇英语对话 关于应聘的 最好是五人的...
  17. 儿童退烧药“布洛芬混悬液”真相解密
  18. 【Oracle 数据库】奶妈式教程 day13 日期函数
  19. iPad2 iOS5.1.1完美越狱教程(Absinthe2)
  20. [渝粤教育] 中国地质大学 统计学 复习题 (2)

热门文章

  1. linux环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
  2. [云炬创业管理笔记]第三章打造优秀创业团队讨论4
  3. 3DSlicer14:Loadable Module
  4. Ie6下asp.net 中treeview自动随鼠标变小的修复
  5. THttprio连接WebService的内存泄漏问题
  6. libevent中指定使用哪种方法如select
  7. Vue 里 几个重要的指令
  8. Consider static factory methods instead of constructor
  9. 【快乐水题】2000. 反转单词前缀
  10. 深入理解Java中异常体系