duilib:设计一个高可用,支持uri下载的duilib控件

2024-03-27 20:38

本文主要是介绍duilib:设计一个高可用,支持uri下载的duilib控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先喵两句,本文只是提供一个具体思路,直接copy肯定编译不过,需要自己实现以下接口:

1. uri下载接口

2. 主线程调用接口(如果可能的话)

3. 线程池

duilib默认没有支持uri图片的控件,很多业务逻辑都需要自己实现,因此就有了以下的大胆想法,由于图片下载/显示的逻辑都很雷同,没必要一个个继承,然后重复写一套逻辑,显得代码很冗余,于是就有了以下想法,直接用模板类来实现这些接口。

代码上面也会有相应的注释,将就着看吧:

.h文件:

using namespace std::tr2;//这里你可以根据需要实例化各种控件,比如edit,combo等
template<typename Control>
class CUriControlUI : Control {
public:static DuiLib::CControlUI* CreateControl();public:CUriControlUI() {//m_tp.init(1);}~CUriControlUI() {m_tp.destroy();}void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue){if (_tcsicmp(pstrName, _T("url")) == 0) {m_url = pstrValue;//在初始化的时候,这个管理器有可能没有创建出来if (!m_pManager) {//OnInit是基类实现的一套观察者模式的机制,有点像C#里面event//在空间初始化完成后,再调用下载接口,设置图片就万无一失了OnInit += MakeDelegate(this, &CUriControlUI<Control>::OnControlReady);}else {m_tp.add_task(std::bind(&CUriControlUI<Control>::LoadUriImg, this));}}Control::SetAttribute(pstrName, pstrValue);}
private:bool OnControlReady(void*) {//线程池,需要自己实现,当然随便开个线程来做也行m_tp.add_task(std::bind(&CUriControlUI<Control>::LoadUriImg, this));return true;}int LoadUriImg() {if (-1 == m_url.Find(L"http:") && -1 == m_url.Find(L"https:")){return -1;}else {std::string filename = CStringUtil::url_encode(XW2A(m_url.GetData()));std::string local = CGlobalDataManage::GetInstance().GetUserDirectory() + "\\" + filename;sys::path file(local);if (!sys::exists(file)){//需要自己实现图片下载接口if (0 != HTTPDOWDLOAD_SYNC(XW2A(m_url.GetData()),local,HTTP_HEADER)){return -1;}}else{}if (m_pManager) {//这里是主线程调用接口,UI的东西肯定UI线程操作嘛POST_MAIN_THREAD_SYNC_TASK(m_pManager->GetPaintWindow(), [&] (){SetBkImage(XA2W(local).c_str());});}return 0;}}DuiLib::CDuiString				m_url;//uriCThreadPool						m_tp;//线程池
};//这里仅仅展示label跟button的例子
using CUriLabelUI = CUriControlUI<DuiLib::CLabelUI>;
using CUriButtonUI = CUriControlUI<DuiLib::CButtonUI>;

.cpp

//就是定义CreateControl接口而已
IMPLEMENT_DUICONTROL(CUriLabelUI)
IMPLEMENT_DUICONTROL(CUriButtonUI)

注册控件

需要的地方往duilib的factory注册以上的控件即可

这篇关于duilib:设计一个高可用,支持uri下载的duilib控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853316

相关文章

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问