网站平台开发多少钱/怎么免费创建个人网站

网站平台开发多少钱,怎么免费创建个人网站,团购网站建设,六安市 网站集约化建设StatusTracker介绍 StatusTracker是Android15 Camera框架中用来协调Camera3各组件之间状态转换的类。 StatusTracker线程名:std::string("C3Dev-") mId "-Status" Camera3 StatusTracker工作原理 StatusTracker实现批处理(状态…

StatusTracker介绍

StatusTracker是Android15 Camera框架中用来协调Camera3各组件之间状态转换的类。

StatusTracker线程名:std::string("C3Dev-") + mId + "-Status"

Camera3 StatusTracker工作原理

StatusTracker实现批处理(状态转换)的基础

StatusTracker对组件(component)状态的跟踪和处理,主要围绕三个表一个线程来实现:

  • 三个表
    • mComponentName 用于记录注册的组件名字和跟踪id。
    • mState  用于记录注册的组件状态。
    • mPendingChangeQueue 用于记录组件pending StateChange(提交的某个组件的statechange, 待后续处理完成)。
  • 一个工作线程
    • threadLoop

首先,一个component通过addComponent()向StatusTracker注册跟踪,StatusTracker会根据当前注册情况为这个component分配一个trackId(mNextComponentId记录当前注册了多少component),并将这个component登记到mComponentName表,以默认IDLE的状态登记到mState表。

然后,一个component通过markComponentActive(trackId)或者makrComponentIdle(trackId, Fence)向StatusTracker提交一个状态转换(StateChange),StatusTracker将这个component的状态转换请求添加到mPendingChangeQueue。StatusTracker工作线程负责处理提交到mPendingChangeQueue的状态转换。

StatusTracker工作线程的6个状态

StatusTracker工作线程有6个状态,状态之间的转换如下

图1.StatusTracker工作线程状态转换图 

StatusTracker的生与死由Camera3Device控制。Camera3Device::initializeCommonLocked()初始化基础内容时创建并启动这个StatusTracker工作线程;Camera3Device::disconnectImpl()主动调用requestExit(),将StatusTracker工作线程标记为dead, 系统Thread实现触发最终的StatusTracker工作线程退出。

StatusTracker处理一次状态转换可能有两种情况

  • 跟踪的组件有变化。包括组件通过addComponent()/removeComponent()主动注册或注销,也包括状态转换处理后组件idle(idleFence)。
  • 跟踪的组件状态有变化。组件通过markComponentX()主动标记状态。

StatusTracker工作线程相关的两个信号

从图1.StatusTracker工作线程状态转换图中,StatusTracker工作线程协作有两个信号:

  • mPendingChangeSignal信号,是组件状态更改提交(尚未完成)的信号。组件主动注册/注销/标记状态会触发这个信号,Camera3Device结束StatusTracker工作线程也会发这个信号。
  • mFlushCondition信号,是一批状态变更完成的信号。当所有的状态变更处理完会清空mPendingChangeQueue,并发送这个信号,表示StatusTracker已经冲刷完成。

StatusTracker工作线程处理状态转换

StatusTracker一次状态处理使分三步做的:

1. 将mPendingChangeQueue中的各组件状态变更统一收集到mStateTransitions,同时更新跟踪状态表。

2.将状态变更通知给parent(这里也就是Camera3Device)

3.所有的pengding change处理完,标记tracker为flushed

代码如下:

StatusTracker收集组件状态转换(包括组件间中间状态转换)

         sp<Camera3Device> parent;
198      {
199          Mutex::Autolock pl(mPendingLock);
200          Mutex::Autolock l(mLock);
201  
202          // Collect all pending state updates and see if the device
203          // collectively transitions between idle and active for each one
204  //获取被跟踪组件的状态,优先获取到active状态的//如果所有的组件都是idle状态,那么检查fence时间戳确定xx状态
205          // First pass for changed components or fence completions
206          ComponentState prevState = getDeviceStateLocked();//疑问:组件状态和mDeviceState怎么达到一致?//这里收集状态的切换, 有两种可能:active->idle, idle->active
207          if (prevState != mDeviceState) {
208              // Only collect changes to overall device state
209              mStateTransitions.add(prevState);
210          }
211          // For each pending component state update, check if we've transitioned
212          // to a new overall device state
213          for (size_t i = 0; i < mPendingChangeQueue.size(); i++) {//一个状态转换动作
214              const StateChange &newState = mPendingChangeQueue[i];//这个状态转换动作是哪个组件来做
215              ssize_t idx = mStates.indexOfKey(newState.id);
216              // Ignore notices for unknown components
217              if (idx >= 0) {//更新这个组件的状态
218                  // Update single component state
219                  mStates.replaceValueAt(idx, newState.state);//这是什么意思?
220                  mIdleFence = Fence::merge(String8("idleFence"),
221                          mIdleFence, newState.fence);//检查被跟踪的组件状态//收集状态切换
222                  // .. and see if overall device state has changed
223                  ComponentState newState = getDeviceStateLocked();
224                  if (newState != prevState) {
225                      mStateTransitions.add(newState);
226                  }
227                  prevState = newState;
228              }
229          }//一次状态切换收集后,清空mPendingChangeQueue以进行下一次状态收集。
230          mPendingChangeQueue.clear();
231          mComponentsChanged = false;
232  
233          // Store final state after all pending state changes are done with
234          //一次状态收集后,得到StatusTracker的状态
235          mDeviceState = prevState;
236          parent = mParent.promote();
237      }

StatusTracker将收集的状态转换通知给parent (Camera3Device)

if (mStateTransitions.size() > 0 && parent.get()) {for (size_t i = 0; i < mStateTransitions.size(); i++) {bool idle = (mStateTransitions[i] == IDLE);ALOGV("Camera device is now %s", idle ? "idle" : "active");parent->notifyStatus(idle);}
}
mStateTransitions.clear();

StatusTracker代码实现中的几个点

//StatusTracker工作线程退出需要Camera3Device主动触发
//但是StatusTracker本质是Android Thread, 退出有一定的延时性。
//退出相关代码:
void StatusTracker::requestExit()
{//First mark thread dead.Thread::requestExit();//Then exit any waitsmPendingChangeSignal.signal();mFlushCondition.signal();
}bool StatusTracker::threadLoop()
{{Mutex::Autolock pl(mPendinglock);while (mPendingChangeQueueSize() == 0 && !mComponentsChanged) {//等待pending change处理信号res = mPendingChangeSignal.waitRelative(mPendingLock, kWaitDuration);//线程退出if (exitPending()) return false;if (res != OK) {if (res != TIMED_OUT) {ALOGE("%s: Error waiting on state changes: %s (%d)",__FUNCTION__, strerror(-res), res);}//TIMED_OUT is expectedbreak;}}}...
}

Camera3中的StatusTracker

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用OpenResty拦截SQL注入

需求 客户的一个老项目被相关部门检测不安全&#xff0c;报告为sql注入。不想改代码&#xff0c;改项目&#xff0c;所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些&#xff0c;都给拦截掉&#xff0c;从而实现拦截sql…

警惕AI神话破灭:深度解析大模型缺陷与禁用场景指南

摘要 当前AI大模型虽展现强大能力&#xff0c;但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性&#xff0c;揭示医疗诊断、法律决策等8类禁用场景&#xff0c;提出可信AI建设框架与用户防护策略。通过理论分析与实操案…

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界?

颠覆语言认知的革命&#xff01;神经概率语言模型如何突破人类思维边界&#xff1f; 一、传统模型的世纪困境&#xff1a;当n-gram遇上"月光族难题" 令人震惊的案例&#xff1a;2012年Google语音识别系统将 用户说&#xff1a;“我要还信用卡” 系统识别&#xff…

【Linux】详谈 基础I/O

目录 一、理解文件 狭义的理解&#xff1a; 广义理解&#xff1a; 文件操作的归类认知 系统角度 二、系统文件I/O 2.1 标志位的传递 系统级接口open ​编辑 open返回值 写入文件 读文件 三、文件描述符 3.1&#xff08;0 & 1 & 2&#xff09; 3.2 文件描…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA&#xff1a;检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景&#xff1a; GAN-SR模型虽然…

Vue3 Pinia 符合直觉的Vue.js状态管理库

Pinia 符合直觉的Vue.js状态管理库 什么时候使用Pinia 当两个关系非常远的组件&#xff0c;要传递参数时使用Pinia组件的公共参数使用Pinia

Javaweb后端文件上传@value注解

文件本地存储磁盘 阿里云oss准备工作 阿里云oss入门程序 要重启一下idea&#xff0c;上面有cmd 阿里云oss案例集成 优化 用spring中的value注解

DeepSeek大语言模型下几个常用术语

昨天刷B站看到复旦赵斌老师说的一句话“科幻电影里在人脑中植入芯片或许在当下无法实现&#xff0c;但当下可以借助AI人工智能实现人类第二脑”&#xff08;大概是这个意思&#xff09; &#x1f49e;更多内容&#xff0c;可关注公众号“ 一名程序媛 ”&#xff0c;我们一起从 …

MYSQL之创建数据库和表

创建数据库db_ck &#xff08;下面的创建是最好的创建方法&#xff0c;如果数据库存在也不会报错&#xff0c;并且指定使用utf8mb4&#xff09; show databases命令可以查看所有的数据库名&#xff0c;可以找到刚刚创建的db_ck数据库 使用该数据库时&#xff0c;发现里面没有…

[pytest] 配置

这里写目录标题 PytestInitRun3. 根据命令行选项将不同的值传递给测试函数 Report1. 向测试报告标题添加信息2. 分析测试持续时间 pytest --durations33. 增量测试 - 测试步骤--junitxml{report}.xml1. testsuite1.1 在测试套件级别添加属性节点 record_testsuite_property 2. …

初始化E9环境,安装Sqlserver数据库

title: 初始化E9环境,安装Sqlserver数据库 date: 2025-03-10 19:27:19 tags: E9SqlServer初始化E9环境,安装Sqlserver数据库 安装E9本地环境安装Sql server 数据库1、检查SQL Server服务是否开启2、检查SQL Server网络网络配置是否开启创建一个ecology数据库点击初始化数据库…

在WSL2-Ubuntu中安装CUDA12.8、cuDNN、Anaconda、Pytorch并验证安装

#记录工作 提示&#xff1a;整个过程最好先开启系统代理&#xff0c;也可以用镜像源&#xff0c;确保有官方发布的最新特性和官方库的完整和兼容性支持。 期间下载会特别慢&#xff0c;需要在系统上先开启代理&#xff0c;然后WSL设置里打开网络模式“Mirrored”,以设置WSL自动…

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是&#xff0c;有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射&#xff08;ORM&#xff09;功能而闻名&#xff…

基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Spring(五)容器-依赖注入的三种方式

目录 总结&#xff1a;通用的三种注入方式 1 字段注入 2 构造器注入 3 set注入 总结&#xff1a;通用的三种注入方式 优先使用构造器注入谨慎使用 Setter 注入避免滥用字段注入 通过构造器传入依赖&#xff0c;确保对象创建时即完成初始化。通过 Setter 方法注入依赖&#x…

Python贝壳网二手小区数据爬取(2025年3月更)

文章目录 一、代码整体架构解析二、各部分代码详解1. main()主函数解析2. 会话初始化&#xff08;伪装浏览器身份&#xff09;3. 动态参数生成&#xff08;反爬虫核心机制&#xff09;4. 列表页抓取&#xff08;获取小区列表&#xff09;5. 列表页解析&#xff08;提取小区信息…

使用服务器搭建一个专属的密码管理工具Vaultwarden

一、服务器配置与Docker环境 ‌实例选型与系统准备‌ ‌推荐配置‌&#xff1a;‌1核2GB内存‌&#xff08;莱卡云L1型实例&#xff09;&#xff0c;Vaultwarden资源占用低&#xff0c;适合轻量级部署‌34。‌操作系统‌&#xff1a;选择 ‌Ubuntu 22.04 LTS‌&#xff0c;兼容…

IO学习---->线程

1.创建两个线程&#xff0c;分支线程1拷贝文件的前一部分&#xff0c;分支线程2拷贝文件的后一部分 #include <head.h> sem_t sem; long half_size 0; // 全局变量&#xff0c;供所有线程共享void* product(void *arg) {FILE *src fopen("IO.text", "…

深度学习分词器char-level实战详解

一、三种分词器基本介绍 word-level&#xff1a;将文本按照空格或者标点分割成单词&#xff0c;但是词典大小太大 subword-level&#xff1a;词根分词&#xff08;主流&#xff09; char-level&#xff1a;将文本按照字母级别分割成token 二、charlevel代码 导包&#xff1…

基于SpringBoot实现旅游酒店平台功能六

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…