【厚积薄发】编程技术总结12—项目经验总结之Qt多线程实现汇总界面和底层计算分离
来源:互联网 发布:nba数据吧 编辑:程序博客网 时间:2024/05/22 03:43
需求背景:
主要是做汇总计算界面界面(要显示:进度条、正在计算的提示信息、计算完之后的显示信息)跟底层计算分离,同时该界面能够实现复用,即能支持多种计算的进度显示。
所做产品计算类型有单机计算(土建计算和钢筋计算)、独立进程计算、局域网计算。
详细分析:
关键点是汇总显示界面要能复用,所以首先显示界面必须跟业务隔离,其次能提供三个接口用于设置显示界面的三个显示区域。
开一个计算线程用于计算,并跟界面主线程界面交互,且该线程实现对外提供的三个接口(面向接口编程)。
计算线程跟界面的交互有两种实现方式,其一:采用信号与槽的方式;其二,也可以采用发送事件的方式来实现(两种文中都给出关键实现)。
主要类及UML:
消息交互主要实现:
实现方法一:采用信号与槽的方式(上述UML中采用的),GTJCalculateThread计算线程中实现的4个update函数中发送对应的emit信号,主界面类GTJAllProgressForm中实现接受该信号的4种槽函数,并在构造函数中实现绑定。主要代码如下:
connect(m_CalculatorThread,SIGNAL(snUpdateProgress(unsigned)), this, SLOT(slUpdateProgress(unsigned)),Qt::QueuedConnection);
connect(m_CalculatorThread,SIGNAL(snUpdatePrompt(const QString)), this, SLOT(slUpdatePrompt(constQString)), Qt::QueuedConnection);
connect(m_CalculatorThread,SIGNAL(snExportFinish(QString, QString, bool)), this,SLOT(slCalcFinished(QString, QString, bool)), Qt::QueuedConnection);
connect(m_CalculatorThread,SIGNAL(snSetNetworkCalcInf(const QString)), this,SLOT(slSetNetworkCalcInf(const QString)), Qt::QueuedConnection);
Qt::QueuedConnection连接方式,When emitted, the signal is queued until theevent loop is able to deliver it to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这个signal包装成一个QEvent,放到消息队列里。QApplication::exec()或者线程的QThread::exec()会从消息队列里取消息,然后调用 signal关联的几个slot。这种方式既可以在线程内传递消息,也可以跨线程传递消息。
实现方法二:采用基于事件的方式,线程计算过程中需要向界面更新的时发送对应的事件(UML图如下),如更新提示信息QApplication::postEvent(m_pProgressFrom, new QUpdatePromptEvent("正在计算墙相关的工程量"));GTJAllProgressForm界面类中实现基类事件处理函数virtual void customEvent(QEvent * pEvent),在该函数中处理上面线程发出的事件,如QUpdatePromptEvent* updatePromptEvent = dynamic_cast<QUpdatePromptEvent*>(pEvent);
if (updatePromptEvent!= nullptr){
m_pMsgPromptLabel->setText(updatePromptEvent->m_strPrompt);}
- 【厚积薄发】编程技术总结12—项目经验总结之Qt多线程实现汇总界面和底层计算分离
- 【厚积薄发】编程技术总结11—项目经验总结之参数化建模数据基类的设计与演进
- 【厚积薄发】编程技术总结6—继承、实现、依赖、关联、聚合、组合简介
- 【厚积薄发】编程技术总结1—内存布局详解
- 【厚积薄发】编程技术总结2—内存泄露详解
- C#实现多线程时如何将底层服务与界面表现分离?
- qt实现界面显示和打印部分分离
- 【厚积薄发】编程技术总结3—递归函数使用的优缺点详解
- 【厚积薄发】编程技术总结4—new、delete、malloc、free简述
- 【厚积薄发】编程技术总结5—C/C++/JAVA区别简述
- 【厚积薄发】编程技术总结7—封装、继承、多态简介
- 【厚积薄发】编程技术总结8—常见笔试面试题小结
- 【厚积薄发】编程技术总结9—常见指针笔试面试题详解
- 【厚积薄发】编程技术总结10—TCP/IP网络传输协议
- MFC界面编程技术汇总
- 【趣发现】10分钟带你看透区块链和云计算之底层技术三要素
- 接口与实现分离技术学习总结
- LInux多线程编程技术总结
- POJ 1683 Puzzlestan 笔记
- 决策树01——决策树的原理
- 【Java基础一】
- 多线程-获取和设置线程对象名称
- 关于Raspbian上安装AirPlay服务之后的问题
- 【厚积薄发】编程技术总结12—项目经验总结之Qt多线程实现汇总界面和底层计算分离
- Java基础二
- 创始人重返Twitter帮助CEO多西塑造企业文化!
- Java实习面试经历
- margin对css绝对定位的影响
- 每天学一点Swift----面向对象上(九)
- RTP_h264解包源码
- 库克慈善午餐竞拍的最高记录!
- Java基础三