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

相关文章

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应