Awtk 如何添加开机画面
场景
我们知道在工程中,Ui是一个线程,并且需要一直存在,当我们使用的开机画面在这个线程开启就直接展示的时候,因为awtk的界面是window_open入栈的,即首次打开的窗口会记录在top,往后的窗口会依次往后存放,并记录位置,当跳回主界面的时候,此时调用的window_manager_back_to_home/window_manager_get_top_window会出现开机界面,因此开机画面如果不做回收释放,就会一直存在。
如果要做回收释放,开机界面必须要实现为,可以释放内存的堆结构,并且记录窗口指针,提供外部释放。(同时需要注意一点,window_open调用和释放窗口指针等结构都必须要在ui线程,防止多线程操作死机。)后续在跳回主界面的时候,就会直接回到主界面,而不会回到开机界面,但是当显示是开机界面,如果加入其他界面呢?,就需要采用idle_queue添加主窗口(交互界面中,主窗口为其他窗口的入口)了。
//主窗口某一按键功能,位于ui线程if (evt->key == TK_KEY_F10) {window_manager_back_to_home(wm); //如果没有释放开机界面,回不到主窗口,并且操作会挂掉。//win = window_manager_get_top_window(wm);win = widget_child(window_manager(), "win_main");return_value_if_fail(win != NULL, RET_STOP);button_win_pages_set(win,FALSE);return RET_STOP;} ...
具体更改实现
主线程
//假设主函数有ui线程和work线程。
int main(int argc,char* argv[])
{thread_start(WinMain(ui线程));thread_start(work线程);while(1){delay(1);}
}
ui线程
int WinMain(void)
{int lcd_w = 800;int lcd_h = 480;
#if defined(LCD_W) && defined(LCD_H)lcd_w = LCD_W;lcd_h = LCD_H;
#endif#ifdef WITH_FS_RESchar res_root[MAX_PATH + 1];char app_root[MAX_PATH + 1];path_app_root(app_root);memset(res_root, 0x00, sizeof(res_root));
#if LCD_W == 480path_build(res_root, MAX_PATH, app_root, "res_480_272", NULL);
#elsepath_build(res_root, MAX_PATH, app_root, "res_800_480", NULL);
#endiftk_init(lcd_w, lcd_h, APP_SIMULATOR, NULL, res_root);
#elsetk_init(lcd_w, lcd_h, APP_SIMULATOR, NULL, NULL);
#endif#endif//#define WITH_LCD_PORTRAIT 1
#if defined(USE_GUI_MAIN) && defined(WITH_LCD_PORTRAIT)if (lcd_w > lcd_h) {tk_set_lcd_orientation(LCD_ORIENTATION_90);}
#endif /*WITH_LCD_PORTRAIT*/#ifdef WITH_LCD_LANDSCAPEif (lcd_w < lcd_h) {tk_set_lcd_orientation(LCD_ORIENTATION_90);}
#endif /*WITH_LCD_PORTRAIT*//* 初始化资源 */assets_init();/*初始化扩展和自定义窗口*/tk_ext_widgets_init();custom_widgets_init();/* 实现UI app应用 即用户界面主入口*/application_init(); //进入用户的ui界面_gui_init_done = 1;/* awtk死循环运行 */tk_run();return 0;
}static void* pwin=NULL;
void setprogress_bar(int progress) //外部触发ui释放窗口内存。
{if(pwin){close_Swin(pwin);pwin=NULL;}
}ret_t application_init(void) {
#if 1pwin=awtk_show_start_box(); //只刷新开机界面 ,并记录窗口句柄return_value_if_fail(awtk_adapter_init() != RET_OK, RET_FAIL);
#else //同时打开开机界面和主界面的方式是不正确的pwin=awtk_show_start_box();open_win_application();return_value_if_fail(awtk_adapter_init() != RET_OK, RET_FAIL);
#endifreturn RET_OK;
}ret_t open_win_application(void) //主窗口是打开其他窗口的入口。
{common_id_string_tab_init();open_window_manager(); //管理所有窗口open_sys_bar();widget_t* win = window_open("win_main");return_value_if_fail(win != NULL, RET_FAIL);common_win_pages_set(win);button_win_pages_set(win,FALSE);widget_t* canvas = canvas_widget_create(win,10,180,60 ,48);widget_on(canvas, EVT_PAINT, on_paint_vgcanvas, NULL);common_id_fun_tab_foreach(win, win_main_fun_tab, WIN_MAIN_FUN_TAB_SIZE, PM_UPDATE_PARAM);widget_on(win, EVT_KEY_DOWN, on_win_key_down, win);widget_foreach(win, init_widget, win);return RET_OK;
}static ret_t idle_close_start_box( const idle_info_t* idle )
{return_value_if_fail( idle != NULL, RET_BAD_PARAMS );idle_data_t* p_data = (idle_data_t*)( idle->ctx );if ( p_data && p_data->win ) {p_data->callfun_b_enter = FALSE;timer_remove(p_data->timer_id);window_close( p_data->win ); //释放窗口win_close_need_free_mem( p_data );};return RET_OK;
}void close_Swin( void* p ) //必须ui线程调用
{idle_queue( idle_close_start_box, p );
}
//开机界面必须使用堆创建的方式,直接静态界面,直接将界面缓存在内部管理的链表中,
//如果没有提供外部释放接口。在返回top层,开启home界面的时候,显示的就不是主界面,
//而是开机界面。不符合设计。并且此时操作界面按键,会引起死机。
static ret_t idle_show_start_box( const idle_data_t* idle )
{return_value_if_fail( idle != NULL, RET_BAD_PARAMS );idle_data_t* p_data = idle;widget_t* win = window_open( "home" );//win_debugif ( win == NULL ) {win_close_need_free_mem( p_data );return RET_BAD_PARAMS;}widget_t* title = widget_get_child( win, 0 );widget_t* client = widget_get_child( win, 1 );widget_t* widget = NULL;p_data->win = win; //记录窗口,供外部释放。//if ( p_data->dis_type == MSGBOX_DIS_DELAY ) {widget = widget_get_child( client, 1 );widget_set_visible( widget, FALSE, TRUE );widget = widget_get_child( client, 2 );widget_set_visible( widget, FALSE, TRUE );p_data->timer_id = timer_add( on_timer_Sclose_win, p_data, 500 );//}return RET_OK;
}void* awtk_show_start_box()
{idle_data_t* p = TKMEM_ZALLOC( idle_data_t ); //awtk内部堆申请内存if(p){wstr_init( &p->text, WSTRLENTH );wstr_set_utf8( &p->text, "" );p->info_type = 0;p->dis_type = 0;p->callfun = NULL;p->win = NULL;idle_show_start_box(p);}return p;
}
work线程
uint32_t work线程()
{//dosomething ......idle_queue( OnAwtkUiDone, this ); //通过这个接口往ui线程添加主窗口,//dosomething ......
}ret_t OnAwtkUiDone( const idle_info_t* idle )
{CCoreEngine* pCore = (CCoreEngine*)idle->ctx;if ( pCore ){pCore->OnGuiStartDone();}return RET_REMOVE;
}void CCoreEngine::OnGuiStartDone()
{
#if OPEN_AWTKsetprogress_bar(100); //当bar到达100%后,释放开机界面open_win_application(); //引入主界面
#endif
}
相关文章:
Awtk 如何添加开机画面
场景 我们知道在工程中,Ui是一个线程,并且需要一直存在,当我们使用的开机画面在这个线程开启就直接展示的时候,因为awtk的界面是window_open入栈的,即首次打开的窗口会记录在top,往后的窗口会依次往后存放&…...

关于多语言商城系统的开发流程
建设多语言商城系统是现在很多传统外贸企业的选择,外贸企业通过多语言电商系统开展海外业务,那么多语言商城系统的开发流程是怎么样的呢?接下来就跟着小来一起来看看吧。 1、页面UI设计 多语言商城系统的原型图经过反复推敲修正后࿰…...

IDEA中常见问题汇总
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

计算机视觉-拟合
一、拟合 拟合的作用主要是给物体有一个更好的描述 根据任务选择对应的方法(最小二乘,全最小二乘,鲁棒最小二乘,RANSAC) 边缘提取只能告诉边,但是给不出来数学描述(应该告诉这个点线是谁的&a…...

CSS 实现下拉菜单效果实例解析
1. 引言 在 Web 开发过程中,下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例,本文将以一个简洁的实例为出发点,从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析,帮助大家理解纯 C…...
DeepSeek模拟阿里面试——Mysql
1.数据库基础知识 关系型数据库是什么? 关系型数据库是基于关系模型的数据库,使用表格来存储数据,表格之间可以通过键建立关系。 数据库的ACID特性是什么? 原子性(Atomicity):事务要么全部完成…...
MVVM设计模式
MVVM(Model-View-ViewModel)是一种软件设计模式,MVVM模式由三个主要部分组成: Model(模型):负责管理应用程序的业务逻辑和数据。它不关心UI如何展示数据,主要负责与服务器通信和数据处处…...
解决:Cannot find a valid baseurl for repo: base/7/x86_64
传送门 repo_file/etc/yum.repos.d/CentOS-Base.repo cp ${repo_file} ~/CentOS-Base.repo.backup sudo sed -i s/#baseurl/baseurl/ ${repo_file} sudo sed -i s/mirrorlist.centos.org/vault.centos.org/ ${repo_file} sudo sed -i s/mirror.centos.org/vault.centos.org/ $…...
ffmpeg -codecs
1. ffmpeg -codecs -loglevel quiet 显示ffmpeg支持的编解码器 2. 输出 选取部分结果: Codecs: D..... Decoding supported .E.... Encoding supported ..V... Video codec ..A... Audio codec ..S... Subtitle codec ...I.. Intra frame-only code…...

社区版IDEA中配置TomCat(详细版)
文章目录 1、下载Smart TomCat2、配置TomCat3、运行代码 1、下载Smart TomCat 由于小编的是社区版,没有自带的tomcat server,所以在设置的插件里面搜索,安装第一个(注意:安装时一定要关闭外网,小编因为这个…...
强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略
目录 一、引言二、强化学习基础回顾(一)策略(二)价值函数 三、近端策略优化(PPO)算法(一)算法原理(二)PPO 目标函数(三)代码示例&…...
长安链支撑全国不动产登记数据可信流通
转自人民日报客户端 不动产登记事关亿万企业、家庭的切身利益。促进不动产登记数据安全流通、业务高效协同,是各方持续努力的目标。记者1月7日从国家区块链技术创新中心获悉,我国自主可控、性能领先的区块链软硬件技术体系长安链,支撑自然资…...

GitCode 助力 Dora SSR:开启游戏开发新征程
项目仓库(点击阅读原文链接可直达) https://gitcode.com/ippclub/Dora-SSR 跨越技术藩篱,构建游戏开发乐园 Dora SSR 是一款致力于打破游戏开发技术壁垒的开源游戏引擎。其诞生源于开发者对简化跨平台游戏开发环境搭建的强烈渴望࿰…...
获取 Windows 视频时长的正确方式——Windows Shell API 深度解析
在 Qt 开发中,有时需要获取视频文件的时长,最直接的方法是在 Windows 上使用 Windows Shell API。然而,这涉及到 IShellItem、IPropertyStore 等 COM 组件,并需要正确处理 PKEY_Media_Duration。本篇文章将详细解析 Windows Shell API 获取视频时长的正确实现方式,并解决常…...
Linux系统安装Nginx详解(适用于CentOS 7)
目录 1. 更新系统包 2. 安装EPEL仓库 3. 安装Nginx 4. 启动Nginx服务 5. 设置Nginx开机自启 6. 检查Nginx状态 7. 配置防火墙 8. 访问Nginx默认页面 9. 配置Nginx(可选) 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...

深入理解Java对接DeepSeek
其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日…...
flutter isolate到底是啥
在 Flutter 中,Isolate 是一种实现多线程编程的机制,下面从概念、工作原理、使用场景、使用示例几个方面详细介绍: 概念 在 Dart 语言(Flutter 开发使用的编程语言)里,每个 Dart 程序至少运行在一个 Isol…...
深入剖析 Apache Shiro550 反序列化漏洞及复现
目录 前言 一、认识 Apache Shiro 二、反序列化漏洞:隐藏在数据转换中的风险 三、Shiro550 漏洞:会话管理中的致命缺陷 四、漏洞危害:如多米诺骨牌般的连锁反应 五、漏洞复现:揭开攻击的神秘面纱 (一࿰…...
计算机毕业设计——Springboot的简历系统
📘 博主小档案: 花花,一名来自世界500强的资深程序猿,毕业于国内知名985高校。 🔧 技术专长: 花花在深度学习任务中展现出卓越的能力,包括但不限于java、python等技术。近年来,花花更…...

【kubernetes组件合集】深入解析Kubernetes组件之三:client-go
深入解析Kubernetes组件之三:client-go 目录 深入解析Kubernetes组件之三:client-go 引言 1. client-go简介 2. client-go的功能 2.1 资源操作 2.2 资源监听 2.3 认证和授权 2.4 错误处理和重试 2.5 扩展性和定制化 3. 使用client-go与Kubern…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...