搬砖:回调函数需要知道的_+(#4*&^%$()_)_**^!@%^)

本文深入探讨函数指针的概念,及其在回调函数中的应用,解释了指针函数与函数指针的区别,以及它们在异步调用和层间协作中的作用。

函数指针,指向函数的指针 ------ 函数指针(function pointer)https://blog.youkuaiyun.com/str999_cn/article/details/78591369

回调函数,写的比较通俗易懂了 https://blog.youkuaiyun.com/u011700281/article/details/20049835 

安装钩子后立即执行回调函数 https://bbs.youkuaiyun.com/topics/390598839

c++ 注册回调函数研究

如何用注册回调实现监听 https://blog.youkuaiyun.com/mrailence/article/details/52276853

再论无处不在的回调机制---注册与回调 https://blog.youkuaiyun.com/stpeace/article/details/23792971 

函数回调机制、异步函数回调机制图例详解 https://blog.youkuaiyun.com/zhangliangzi/article/details/52066560

 

异步调用和回调函数 https://blog.youkuaiyun.com/kobejayandy/article/details/17654967

 

指针函数是函数。返回值为指针的函数,

函数指针是指针。function pointer ,fuck it pointer

函数指针和指针函数用法和区别 https://blog.youkuaiyun.com/luoyayun361/article/details/80428882

定义不同

指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
写法不同

指针函数:int* fun(int x,int y);
函数指针:int (*fun)(int x,int y);
可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

 

 

个人分类: 架构与设计

       异步调用在应用程序框架中具有广泛的应用,并且特指多线程情况下。它同Windows的消息循环机制,消息响应,消息队列,事件驱动机制以及设计模式中的观察者模式等都是紧密相关的。 在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方才能继续往下执行。有了多线程的支持,可以采用异步调用,调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等对方返回结果就继续执行后续代码。被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理。


       回调函数用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,它将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装。这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。  其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

 

 

如果你想要通过循环刷新背景颜色,可以使用 `lv_obj_add_style` 函数来为对象添加样式。然后,通过在循环中修改样式的属性来达到刷新的效果。下面是一个示例代码,展示了如何在 LVGL 中循环刷新背景颜色: ```c #include "lvgl/lvgl.h" lv_obj_t *obj; lv_style_t style; void setup(void) { lv_obj_t *scr = lv_disp_get_scr_act(NULL); obj = lv_obj_create(scr, NULL); lv_obj_set_size(obj, LV_HOR_RES, LV_VER_RES); lv_obj_align(obj, NULL, LV_ALIGN_CENTER, 0, 0); lv_style_init(&style); lv_style_set_bg_color(&style, lv_palette_main(0)); lv_style_set_bg_opa(&style, LV_OPA_COVER); lv_obj_add_style(obj, LV_OBJ_PART_MAIN, &style); } void refresh_background_color(void) { static uint8_t color_index = 0; lv_style_set_bg_color(&style, lv_palette_main(color_index)); lv_obj_refresh_style(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT); color_index++; if (color_index >= LV_PALETTE_LAST) { color_index = 0; } } int main(void) { lv_init(); lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.disp_flush = your_flush_cb; // 设置你的显示驱动回调函数 lv_disp_drv_register(&disp_drv); setup(); while (1) { lv_task_handler(); your_event_handler(); // 处理你的事件 // 每隔一段时间刷新背景颜色 lv_tick_inc(10); // 增加 LVGL 的系统时钟 if (lv_tick_get() % 1000 == 0) { refresh_background_color(); } } return 0; } ``` 在上面的示例代码中,我们创建了一个对象 `obj`,并通过 `lv_style_set_bg_color` 函数设置了初始的背景颜色。然后,我们通过 `lv_obj_add_style` 函数将样式应用到对象上。在 `refresh_background_color` 函数中,我们通过修改样式的背景颜色属性来刷新背景颜色,并调用 `lv_obj_refresh_style` 函数来更新对象的样式。 你可以根据需要修改示例中的相关参数,比如刷新的时间间隔和背景颜色变化的方式。同时,你还需要根据自己的具体情况实现显示驱动回调函数和事件处理函数。 希望这个示例对你有所帮助!如有任何疑问,请随时提问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值