当前位置: 首页 > news >正文

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 如何添加开机画面

场景 我们知道在工程中&#xff0c;Ui是一个线程&#xff0c;并且需要一直存在&#xff0c;当我们使用的开机画面在这个线程开启就直接展示的时候&#xff0c;因为awtk的界面是window_open入栈的&#xff0c;即首次打开的窗口会记录在top&#xff0c;往后的窗口会依次往后存放&…...

关于多语言商城系统的开发流程

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

IDEA中常见问题汇总

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

计算机视觉-拟合

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

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…...

DeepSeek模拟阿里面试——Mysql

1.数据库基础知识 关系型数据库是什么&#xff1f; 关系型数据库是基于关系模型的数据库&#xff0c;使用表格来存储数据&#xff0c;表格之间可以通过键建立关系。 数据库的ACID特性是什么&#xff1f; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务要么全部完成…...

MVVM设计模式

‌MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件设计模式,MVVM模式由三个主要部分组成&#xff1a; ‌Model&#xff08;模型&#xff09;‌&#xff1a;负责管理应用程序的业务逻辑和数据。它不关心UI如何展示数据&#xff0c;主要负责与服务器通信和数据处处…...

解决: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. 输出 选取部分结果&#xff1a; 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 由于小编的是社区版&#xff0c;没有自带的tomcat server&#xff0c;所以在设置的插件里面搜索&#xff0c;安装第一个&#xff08;注意&#xff1a;安装时一定要关闭外网&#xff0c;小编因为这个…...

强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略

目录 一、引言二、强化学习基础回顾&#xff08;一&#xff09;策略&#xff08;二&#xff09;价值函数 三、近端策略优化&#xff08;PPO&#xff09;算法&#xff08;一&#xff09;算法原理&#xff08;二&#xff09;PPO 目标函数&#xff08;三&#xff09;代码示例&…...

长安链支撑全国不动产登记数据可信流通

转自人民日报客户端 不动产登记事关亿万企业、家庭的切身利益。促进不动产登记数据安全流通、业务高效协同&#xff0c;是各方持续努力的目标。记者1月7日从国家区块链技术创新中心获悉&#xff0c;我国自主可控、性能领先的区块链软硬件技术体系长安链&#xff0c;支撑自然资…...

GitCode 助力 Dora SSR:开启游戏开发新征程

项目仓库&#xff08;点击阅读原文链接可直达&#xff09; https://gitcode.com/ippclub/Dora-SSR 跨越技术藩篱&#xff0c;构建游戏开发乐园 Dora SSR 是一款致力于打破游戏开发技术壁垒的开源游戏引擎。其诞生源于开发者对简化跨平台游戏开发环境搭建的强烈渴望&#xff0…...

获取 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&#xff08;可选&#xff09; 10. 重启Nginx 解决步骤 1. 检查系统版本 2. 移除错误的 Nginx 仓库 …...

深入理解Java对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xf…...

flutter isolate到底是啥

在 Flutter 中&#xff0c;Isolate 是一种实现多线程编程的机制&#xff0c;下面从概念、工作原理、使用场景、使用示例几个方面详细介绍&#xff1a; 概念 在 Dart 语言&#xff08;Flutter 开发使用的编程语言&#xff09;里&#xff0c;每个 Dart 程序至少运行在一个 Isol…...

深入剖析 Apache Shiro550 反序列化漏洞及复现

目录 前言 一、认识 Apache Shiro 二、反序列化漏洞&#xff1a;隐藏在数据转换中的风险 三、Shiro550 漏洞&#xff1a;会话管理中的致命缺陷 四、漏洞危害&#xff1a;如多米诺骨牌般的连锁反应 五、漏洞复现&#xff1a;揭开攻击的神秘面纱 &#xff08;一&#xff0…...

计算机毕业设计——Springboot的简历系统

&#x1f4d8; 博主小档案&#xff1a; 花花&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 花花在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于java、python等技术。近年来&#xff0c;花花更…...

【kubernetes组件合集】深入解析Kubernetes组件之三:client-go

深入解析Kubernetes组件之三&#xff1a;client-go 目录 深入解析Kubernetes组件之三&#xff1a;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&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

如何在网页里填写 PDF 表格?

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

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

探索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 数据…...

实战三:开发网页端界面完成黑白视频转为彩色视频

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