【厚积薄发】编程技术总结12—项目经验总结之Qt多线程实现汇总界面和底层计算分离

来源:互联网 发布:nba数据吧 编辑:程序博客网 时间:2024/05/22 03:43

需求背景:

主要是做汇总计算界面界面(要显示:进度条、正在计算的提示信息、计算完之后的显示信息)跟底层计算分离,同时该界面能够实现复用,即能支持多种计算的进度显示。

所做产品计算类型有单机计算(土建计算和钢筋计算)、独立进程计算、局域网计算。


详细分析:

关键点是汇总显示界面要能复用,所以首先显示界面必须跟业务隔离,其次能提供三个接口用于设置显示界面的三个显示区域。

开一个计算线程用于计算,并跟界面主线程界面交互,且该线程实现对外提供的三个接口(面向接口编程)。

计算线程跟界面的交互有两种实现方式,其一:采用信号与槽的方式;其二,也可以采用发送事件的方式来实现(两种文中都给出关键实现)。


主要类及UML:



消息交互主要实现:

实现方法一:采用信号与槽的方式(上述UML中采用的),GTJCalculateThread计算线程中实现的4update函数中发送对应的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.
假设当前有4slot连接到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);}


阅读全文
0 0
原创粉丝点击