后端数据解析过程中,更新前端UI进度条

后端数据解析过程中,更新前端UI进度条

前言

在做前端ui进度条时,总会遇到后端数据解析过程中,前端ui不能同步更新的问题。为解决以上问题。想到最好的办法是通过消息进行通知,ui类监听此消息,进行ui刷新。

源码解析

源码

开放API接口,可用其他模块进行交互

#pragma once
//进度条类接口
class ICStatusProgress
{
public:
	ICStatusProgress() { };
	~ICStatusProgress() { };
public:
	//初始化进度条类,最小值和最大值范围
	virtual bool Init(int nMin, int nMax) = 0;
	
	//设置进度条类进度
	virtual bool SetPosi(int nPos) = 0;
	
	//销毁进度条类
	virtual bool Destroy() = 0;
};

进度条具体实现:

#pragma once
#include "PlantFrameInterface.h"
#include "IProgressBar.h"

class CStatusProgress:public ICStatusProgress
{
public:
	CStatusProgress(){ m_pInterface = nullptr; };
	CStatusProgress(CPlantFrameInterface* pInterFace){ m_pInterface = nullptr; setInterface(pInterFace); };
	~CStatusProgress(){ Destroy();}

	void setInterface(CPlantFrameInterface* pInterFace){ m_pInterface = pInterFace; };

	virtual bool Init(int nMin, int nMax) override
	{
		if (m_pInterface)
		{
			char str[128];
			sprintf_s(str, "InitProgress:%d-%d", nMin,nMax);
			m_pInterface->notice_listener(LT_FILE_UPDATESTATUSBARPROGRESS, str, this);
			return true;
		}
		return false;
	}
	virtual bool SetPosi(int nPos)override
	{
		if (m_pInterface)
		{
			char str[128];
			sprintf_s(str, "SetProgress:%d", nPos);
			m_pInterface->notice_listener(LT_FILE_UPDATESTATUSBARPROGRESS, str, this);
			return true;
		}
		return false;
	}
	virtual bool Destroy()override
	{
		if (m_pInterface)
		{
			char str[128] = "DestroyProgress:";
			m_pInterface->notice_listener(LT_FILE_UPDATESTATUSBARPROGRESS, str, this);
			return true;
		}
		return false;
	}
protected:

	CPlantFrameInterface* m_pInterface;
};

监听消息 LT_FILE_UPDATESTATUSBARPROGRESS ,并设置ui进度条进度。

//设置监听消息 LT_FILE_UPDATESTATUSBARPROGRESS
m_pFrameInterface->add_listener(this, LT_FILE_UPDATESTATUSBARPROGRESS);

//监听消息 LT_FILE_UPDATESTATUSBARPROGRESS ,并设置ui进度条进度。
void CModelCompareOperation::OnNoticeCome(Listener_Type type, void* pData, void* pSender)
{
	if (type == LT_FILE_UPDATESTATUSBARPROGRESS)
	{
		CString strData;
		if (nullptr != pData)
			strData = StringUtf8ToWide((char*)pData).c_str();

		if (m_pModelCompareDlg && !strData.IsEmpty())
			m_pModelCompareDlg->updateWndStatusProgress(strData);

		return;
	}
}

//关于ui类中进度条的设置
bool CMFCModelCompare::updateWndStatusProgress(CString sMsg)
{
	LOG_DEBUGA("updateWndStatusProgress begin");
	int nFind = sMsg.Find(':');
	if (nFind <= 0)
		return false;

	CString sTitle = sMsg.Left(nFind);
	CString sValue = sMsg.Right(sMsg.GetLength() - nFind - 1);
	if (sTitle.CompareNoCase(_T("InitProgress")) == 0)
	{
		nFind = sValue.Find('-');
		if (nFind > 0)
		{
			CString sMin = sValue.Left(nFind);
			CString sMax = sValue.Right(sValue.GetLength() - nFind - 1);
			//m_pProgress = new CMFCRibbonProgressBar(ID_STATUSBAR_PROGRESS, 150, 30);
			//pProgressBar->SetInfiniteMode(m_bInfiniteProgressMode);
		

			m_progress.SetRange(_tstoi(sMin), _tstoi(sMax));
			//m_wndStatusBar.AddDynamicElement(m_pProgress);//动态添加内容

			//m_wndStatusBar.RecalcLayout();
			//m_wndStatusBar.RedrawWindow();
			//RecalcLayout();

			return true;
		}
	}
	else if (sTitle.CompareNoCase(_T("DestroyProgress")) == 0)
	{
		//m_progress = nullptr;
		return true;
		//if (m_wndStatusBar.RemoveElement(ID_STATUSBAR_PROGRESS))
		//{
		//	//m_wndStatusBar.RecalcLayout();
		//	m_wndStatusBar.RedrawWindow();
		//	//m_progress = nullptr;
		//	RecalcLayout();

		//	return true;
		//}
	}
	else if (sTitle.CompareNoCase(_T("SetProgress")) == 0)
	{
		m_progress.SetPos(_tstoi(sValue));
		return true;
	}

	return false;
}

测试逻辑

//测试实例:
  CStatusProgress  statusPro;
  statusPro.setInterface(GetPlantFrameInterface());
  statusPro.Init(0, 100);
  
  //随着模型的对比进度,可以设置进度的百分比
  statusPro.SetPosi(100);
  
  //进度状态销毁
  statusPro.Destroy();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值