当前位置: 首页 > 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…...

线程池-抢票系统性能优化

文章目录 引言-购票系统线程池购票系统-线程池优化 池化 vs 未池化 引言-购票系统 public class App implements Runnable {private static int tickets 100;private static int users 10000;private final ReentrantLock lock new ReentrantLock(true);public void run() …...

WebSocket 握手过程

文章目录 1. WebSocket 握手过程概述2. 客户端发送握手请求3. 服务器响应握手请求4. 客户端验证握手响应5. 建立 WebSocket 连接6. 安全性与注意事项7. 应用示例 在现代 Web 开发中&#xff0c;WebSocket 协议因其高效的实时通信能力而被广泛应用。WebSocket 允许客户端和服务器…...

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图&#xff0c;在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …...

备战蓝桥杯:二分算法之牛可乐和魔法封印问题

这道题就是一道简单的模板题&#xff0c;我们分析一下&#xff01;&#xff0c;首先我们要找大于等于x的起始位置 我们还是用两个指针&#xff0c;left指向1&#xff0c;right指向n&#xff0c;如果a[mid]<x left mid1 如果a[mid]>x 就让right mid 如果数组全是小于x…...

普通用户授权docker使用权限

1、检查docker用户组 sudo cat /etc/group |grep docker 若显示&#xff1a;docker:x:999: # 表示存在否则创建docker用户组&#xff1a; sudo groupadd docker2、查看 /var/run/docker.sock 的属性 ll /var/run/docker.sock 显示&#xff1a; srw-rw---- 1 root root 0 1月…...

【实战篇】DeepSeek + ElevenLabs:让人工智能“开口说话”,打造你的专属语音助手!

最近,AI语音合成技术真是火得不行,各种“开口脆”的AI声音层出不穷,听得我直呼“这也太像真人了吧!” 作为一个科技爱好者,我当然不能错过这股潮流,这不,最近就沉迷于用 DeepSeek 和 ElevenLabs 这两款神器,捣鼓各种人声音频,简直停不下来! 先来科普一下这两位“主角…...

Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式

目录 引言 一、ViT模型的起源和历史 二、什么是ViT&#xff1f; 图像处理流程 图像切分 展平与线性映射 位置编码 Transformer编码器 分类头&#xff08;Classification Head&#xff09; 自注意力机制 注意力图 三、Coovally AI模型训练与应用平台 四、ViT与图像…...

LabVIEW国内外开发的区别

LabVIEW作为全球领先的图形化编程平台&#xff0c;在国内外工业测控领域均占据重要地位。本文从开发理念、技术生态、应用深度及自主可控性四个维度&#xff0c;对比分析国内外LabVIEW开发的差异&#xff0c;并结合国内实际应用场景&#xff0c;探讨其未来发展趋势。 ​ 一、开…...

【并发控制、更新、版本控制】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、并发累计&#xff08;累加&#xff09;1.1 单条批量累计1.2 批量更新并且字段11.3 批量更新并且字段list中对应的…...

淘宝App交易链路终端混合场景体验探索

如何应对产品形态与产品节奏相对确定情况下转变为『在业务需求与产品形态高度不确定性的情况下&#xff0c;如何实现业务交付时间与交付质量的确定性』。我们希望通过混合架构&#xff08;Native 业务容器 Weex 2.0&#xff09;作为未来交易终端架构的重要演进方向&#xff0c…...