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

小智机器人相关函数解析,BackgroundTask::Schedule (***)将一个回调函数添加到后台任务队列中等待执行

以下是对 BackgroundTask::Schedule 函数代码的详细解释:

void BackgroundTask::Schedule(std::function<void()> callback) {std::lock_guard<std::mutex> lock(mutex_);if (active_tasks_ >= 30) {int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);if (free_sram < 10000) {ESP_LOGW(TAG, "active_tasks_ == %u, free_sram == %u", active_tasks_.load(), free_sram);}}active_tasks_++;main_tasks_.emplace_back([this, cb = std::move(callback)]() {cb();{std::lock_guard<std::mutex> lock(mutex_);active_tasks_--;if (main_tasks_.empty() && active_tasks_ == 0) {condition_variable_.notify_all();}}});condition_variable_.notify_all();
}

整体功能概述

BackgroundTask::Schedule 函数的主要功能是将一个回调函数添加到后台任务队列中等待执行。在添加任务之前,会检查当前活跃任务的数量和系统的可用内存,若活跃任务过多且内存不足会输出警告信息。添加任务后,会通知所有等待的线程有新任务加入。

代码逐行解释

void BackgroundTask::Schedule(std::function<void()> callback) {
  • 定义一个名为 Schedule 的成员函数,它属于 BackgroundTask 类。该函数接受一个 std::function<void()> 类型的参数 callback,即一个无参数、无返回值的可调用对象。
    std::lock_guard<std::mutex> lock(mutex_);
  • 创建一个 std::lock_guard 对象 lock,用于自动管理互斥锁 mutex_std::lock_guard 在构造时会自动锁定互斥锁,在析构时会自动解锁,确保在 lock 对象的生命周期内,互斥锁是被锁定的,从而保证线程安全。
    if (active_tasks_ >= 30) {int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);if (free_sram < 10000) {ESP_LOGW(TAG, "active_tasks_ == %u, free_sram == %u", active_tasks_.load(), free_sram);}}
  • 检查当前活跃任务的数量 active_tasks_ 是否大于等于30。
    • 如果是,则调用 heap_caps_get_free_size(MALLOC_CAP_INTERNAL) 函数获取系统内部可用的SRAM(静态随机存取存储器)大小。
    • 若可用SRAM小于10000字节,使用 ESP_LOGW 函数输出警告信息,显示当前活跃任务的数量和可用SRAM的大小。
    active_tasks_++;
  • 增加活跃任务的数量,表示有一个新任务即将被添加到队列中。
    main_tasks_.emplace_back([this, cb = std::move(callback)]() {
  • 使用 emplace_back 方法将一个新的 lambda 表达式添加到 main_tasks_ 任务队列的末尾。
    • 这个 lambda 表达式捕获了 this 指针和 callback (使用 std::move 进行移动语义,避免不必要的复制)。
    • 该 lambda 表达式代表一个任务,当被调用时会执行传入的 callback 函数。
        cb();
  • 在 lambda 表达式内部,调用传入的 callback 函数,执行具体的任务。
        {std::lock_guard<std::mutex> lock(mutex_);active_tasks_--;if (main_tasks_.empty() && active_tasks_ == 0) {condition_variable_.notify_all();}}
  • 再次创建一个 std::lock_guard 对象 lock 来锁定互斥锁 mutex_,以确保对 active_tasks_ 的操作是线程安全的。
  • 任务执行完毕后,减少活跃任务的数量。
  • 检查任务队列 main_tasks_ 是否为空且活跃任务数量为0。如果是,则调用 condition_variable_.notify_all() 通知所有等待的线程,此时没有活跃任务且任务队列为空。
    });condition_variable_.notify_all();
  • 最后,调用 condition_variable_.notify_all() 通知所有等待的线程,有新任务被添加到了任务队列中。

相关文章:

小智机器人相关函数解析,BackgroundTask::Schedule (***)将一个回调函数添加到后台任务队列中等待执行

以下是对 BackgroundTask::Schedule 函数代码的详细解释&#xff1a; void BackgroundTask::Schedule(std::function<void()> callback) {std::lock_guard<std::mutex> lock(mutex_);if (active_tasks_ > 30) {int free_sram heap_caps_get_free_size(MALLOC_…...

基于Python设计的TEQC数据质量可视化分析软件

标题:基于Python设计的TEQC数据质量可视化分析软件 内容:1.摘要 本文旨在设计一款基于Python的TEQC数据质量可视化分析软件。随着全球导航卫星系统&#xff08;GNSS&#xff09;的广泛应用&#xff0c;数据质量的评估变得至关重要。TEQC&#xff08;TransEditQualityCheck&…...

人月神话:如何有效的避免Bug的产生

bug的来源有很多种&#xff0c;一般的小bug很好修复&#xff0c;最头疼的是哪些致命且难以察觉的Bug。这些bug从哪来的&#xff1f; 在人月神话书中说&#xff1a;假设的不匹配是大多数致命和难以察觉的bug的主要来源。 假设来源于各个组成部分的开发者对概念的理解不一致。 为…...

Git的基础使用方法

本文最终功能&#xff1a; 1.从终端直接传输代码给仓库 2.用终端从仓库克隆文件 基本概念 我们先来理解下 Git 工作区、暂存区和版本库概念&#xff1a; 工作区&#xff1a;就是你在电脑里能看到的目录。 暂存区&#xff1a;英文叫 stage 或 index。一般存放在 .git 目录下的…...

轮胎厂相关笔记

一、术语 图解&#xff1a;https://news.yiche.com/hao/wenzhang/38498703/ 1、胚胎 在轮胎制造行业中&#xff0c;“胎胚”&#xff08;也称“生胎”或“未硫化轮胎”&#xff09;是指轮胎在硫化&#xff08;高温高压固化&#xff09;之前的半成品形态。它是轮胎成型的中间…...

Java常用异步方式总结

使用建议 完整代码见https://gitee.com/pinetree-cpu/parent-demon 提供了postMan调试json文件于security-demo/src/main/resources/test_file/java-async.postman_collection.json 可导入postMan中进行调试 Java异步方式以及使用场景 继承Thread类 新建三个类继承Thread&…...

【Easylive】视频在线人数统计系统实现详解 WebSocket 及其在在线人数统计中的应用

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 视频在线人数统计系统实现详解 1. 系统架构概述 您实现的是一个基于Redis的视频在线人数统计系统&#xff0c;主要包含以下组件&#xff1a; 心跳上报接口&#xff1a;客户端定期调用以…...

tomcat 目录结构组成

文章目录 背景文件结构层级一些常用的路径 背景 现在非常多的 java web 服务部署在 linux 服务器中&#xff0c;我们服务器中的 tomcat 会有各种文件路径&#xff0c;看下它有哪些文件 文件结构层级 ├── bin/ # 核心脚本和启动文件 ├── conf/ # …...

苍穹外卖day12

课程内容 工作台 Apache POI 导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系统运…...

Unity Final IK:下一代角色动画与物理交互的技术解析

引言&#xff1a;角色动画的范式转移 在传统游戏开发中&#xff0c;角色动画主要依赖于 前向动力学&#xff08;Forward Kinematics, FK&#xff09; 和预烘焙动画。然而&#xff0c;这种方法的局限性在开放世界、物理交互和VR等场景中愈发明显&#xff1a; 环境适应性差&…...

前端开发时的内存泄漏问题

目录 &#x1f50d; 什么是内存泄漏&#xff08;Memory Leak&#xff09;&#xff1f;&#x1f6a8; 常见的内存泄漏场景1️⃣ 未清除的定时器&#xff08;setInterval / setTimeout&#xff09;2️⃣ 全局变量&#xff08;变量未正确释放&#xff09;3️⃣ 事件监听未清除4️⃣…...

【Feign】⭐️使用 openFeign 时传递 MultipartFile 类型的参数参考

&#x1f4a5;&#x1f4a5;✈️✈️欢迎阅读本文章❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;本篇文章阅读大约耗时三分钟。 ⛳️motto&#xff1a;不积跬步、无以千里 &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&a…...

Linux中动静态库的制作

1.什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个⼈的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是⼀种可执⾏代码的⼆进制形式&#xff0c;可以被操作系统…...

Docker部署sprintboot后端项目

创建Docker网络 docker network create icjs 部署Redis docker run -d \--network icjs \--name redis \-p 6379:6379 \redis:latest数据持久化 docker run --restartalways --network icjs -p 6379:6379 --name redis -v /opt/docker/redis/redis.conf:/etc/redis/redis.c…...

forms实现连连看

说明&#xff1a; forms实现连连看 效果图&#xff1a; step1:C:\Users\wangrusheng\RiderProjects\WinFormsApp2\WinFormsApp2\Form1.cs using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms;namespace …...

多视图几何--立体校正--Fusiello方法

1. 坐标系对齐与正交基构造 目标&#xff1a;构建新坐标系基向量 { e 1 , e 2 , e 3 } \{ \mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3 \} {e1​,e2​,e3​}&#xff0c;使成像平面共面且极线水平对齐。 (1) 基线方向 e 1 \mathbf{e}_1 e1​ 基线向量由左右相机光心平移向量…...

鸿蒙开发踩坑记录 - 2024S2

wrapBuilder如果想View和ObservedV2做绑定 必须要用 ComponentV2 Param 和 区别 退出两层循环 Builder的传入的参数及时是Trace修饰的也无法刷新组件 折叠屏展开后键盘无法点击 vm是公用的&#xff0c;组件生命周期问题导致 监听键盘高度变化失效 原因&#xff1a;分享面…...

【学Rust写CAD】21 2D 点(point.rs)

源码 //matrix/point.rs use std::ops::Mul; use super::algebraic_units::{Zero, One}; use super::generic::Matrix;/// 点坐标结构体 #[derive(Debug, Clone, Copy, PartialEq)] pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y>…...

0基础入门scrapy 框架,获取豆瓣top250存入mysql

一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名&#xff09; 使用终端运行太麻烦了&#xff0c;而且…...

鸿蒙NEXT小游戏开发:井字棋

1. 引言 井字棋是一款经典的两人对战游戏&#xff0c;简单易懂&#xff0c;适合各个年龄段的玩家。本文将介绍如何使用鸿蒙NEXT框架开发一个井字棋游戏&#xff0c;涵盖游戏逻辑、界面设计及AI对战功能。 2. 开发环境准备 电脑系统&#xff1a;windows 10 开发工具&#xff1a;…...

deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天

一、软件介绍 文末提供下载 deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天&#xff0c;这是一个浏览器扩展&#xff0c;它允许用户公开、私下分享他们的聊天对话&#xff0c;并使用密码或过期链接来增强 Deepseek Web UI。该扩展程序在 Deepseek 界面中添加了一个 “…...

4. 理解Prompt Engineering:如何让模型听懂你的需求

引言:当模型变成“实习生” 想象一下,你新招的实习生总把“帮我写份报告”理解为“做PPT”或“整理数据表”——这正是开发者与大模型对话的日常困境。某金融公司优化提示词后,合同审查准确率从72%飙升至94%。本文将用3个核心法则+5个行业案例,教你用Prompt Engineering让…...

网络编程—网络概念

目录 1 网络分类 1.1 局域网 1.2 广域网 2 常见网络概念 2.1 交换机 2.2 路由器 2.3 集线器 2.4 IP地址 2.5 端口号 2.6 协议 3 网络协议模型 3.1 OSI七层模型 3.2 TCP/IP五层模型 3.3 每层中常见的协议和作用 3.3.1 应用层 3.3.2 传输层 3.3.3 网络层 3.3.4…...

基于Rust与WebAssembly实现高性能前端计算

引言 随着Web应用的复杂性增加&#xff0c;前端开发者经常面临性能瓶颈。传统JavaScript在处理密集型计算任务&#xff08;如大数据处理或实时图像渲染&#xff09;时&#xff0c;往往显得力不从心。而Rust语言凭借其高性能和内存安全特性&#xff0c;结合WebAssembly的接近原生…...

MATLAB 代码学习

1. Cell数组 Cell数组用于存储异构数据&#xff0c;每个元素&#xff08;称为cell&#xff09;可以包含不同类型的数据&#xff08;如数值、字符串、矩阵等&#xff09;。 1.1 创建Cell数组 直接赋值&#xff1a;使用花括号{}定义内容。 students {Alice, 20, [85, 90, 78…...

SELinux

一、selinux技术详解 SELinux 概述 SELinux&#xff0c;即 Security-Enhanced Linux&#xff0c;意为安全强化的 Linux&#xff0c;由美国国家安全局&#xff08;NSA&#xff09;主导开发。开发初衷是防止系统资源被误用。在 Linux 系统中&#xff0c;系统资源的访问均通过程…...

Axios 相关的面试题

在跟着视频教程学习项目的时候使用了axios发送请求&#xff0c;但是只是跟着把代码粘贴上去&#xff0c;一些语法规则根本不太清楚&#xff0c;但是根据之前的博客学习了fetch了之后&#xff0c;一看axios的介绍就明白了。所以就直接展示axios的面试题吧 本文主要内容&#xff…...

Spring Cloud 跨云灾备:如何实现5分钟级区域切换?

引言&#xff1a;云原生时代&#xff0c;区域级故障的致命性与应对 在混合云与多云架构中&#xff0c;单个区域的宕机可能导致全局服务瘫痪&#xff08;如2023年AWS美东区域故障影响超200家金融系统&#xff09;。传统灾备方案依赖手动切换DNS或冷备集群&#xff0c;恢复时间长…...

ES6对函数参数的新设计

ES6 对函数参数进行了新的设计&#xff0c;主要添加了默认参数、不定参数和扩展参数&#xff1a; 不定参数和扩展参数可以认为恰好是相反的两个模式&#xff0c;不定参数是使用数组来表示多个参数&#xff0c;扩展参数则是将多个参数映射到一个数组。 需要注意&#xff1a;不定…...

爬虫【feapder框架】

feapder框架 1、简单介绍 简介 feapder上手简单、功能强大的Python爬虫框架&#xff0c;内置AirSpider、Spider、Task、Spider、BatchSpider四种爬虫解决不同场景的需求支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能更有功能强大的爬虫管理系统feaplat为其提供方…...