Android Camera Hal之线程模块


 

CAMX线程模块涉及的主要类: ThreadManager(管理者),JobRegistry(任务注册),ThreadCore(核心)。数据存储涉及的主要结构:JobList(任务链),JobQueue(优先级队列,本质是数组)

通过JobRegistry将camx中其他模块执行任务注册到ThreadManager,ThreadManager通过ThreadCore处理camx模块注册的任务。ThreadCore通过系统线程接口进行多线程的实现。

模块结构与组成

图1-1 ThreadManager的JobList

ThreadManager将使用应用模块的任务处理通过JobRegistry添加到JobList。

图1-2 JobCore优先级队列

JobCore作为线程管理模块的核心处理单元,通过JobQueue即优先级队列对任务进行处理。Job级别由JobPriority定义:Critical、High、Normal。高优先级的任务优先得到系统的处理。

模块实现逻辑

  1. 初始化
  2. 注册处理
  3. 提交任务
  4. 取消处理与注销

初始化

 

图2-1ThreadManager初始化

 

创建JobList和JobQueue,核心处理执行体并建立ThreadCore与成员关系。

JobList存储ThreadManager管理的Job。JobRegistry通过RegisteredSlot标记一个注册,如果Slot为true为注册;RegisteredJob登记注册的任务处理。RegisteredSlot和RegisteredJob通过index对应。ThreadCore通过调用系统接口创建多线程处理优先级队列中的Job。

ThreadManager初始化阶段主要是进行数据结构的构建。JobList用来记录应用模块提交的任务;JobRegistry对使用模块注册的任务处理进行管理,其成员RegisteredSlot为位图标记结构,用于注册标记;ThreadCore作为任务核心调用系统多线程接口完成任务的优先处理。

注册处理

图2-2 任务处理的注册

step1:取可用Slot

step2:RegisteredJob中注册单元完成注册信息的填充

step3:更新RegisteredJob中注册单元Flush状态

提交任务

图2-3 向ThreadManager提交任务

图示以向ThreadManager提交一个Critical类型Job为例。

取消处理与注销

注销前对已注册任务进行取消,即FlushJobFamily。Flush由Blocking和UnBlocking两种方式。

图2-4 取消任务时Flush处理

Flush由两种方式:Blocking和UnBlocking。Blocking方式时需要step3/4等待Flush的结束

任务处理

与提交Job向对应,构成生产者&消费者模型。

 1.生产者消费者模型

 2.状态机

三种状态:NoFlush, FlushRequested, Flushed

DoWork   

未完待续

 

模块接口

这里的接口指供外部模块访问的接口

1.创建一个Thread对象

Create   ThreadManager对象的创建
Destroy  ThreadManager对象销毁

2.JobFamily任务组处理

RegisterJobFamily     注册一个Job处理函数
UnregisterJobFamily
FlushJobFamily
ResumeJobFamily
GetJobCount    获取提交的注册Family的未完成runtime job数
GetInFlightCount 获取当前正在执行的runtime job数

3.提交一个任务

PostJob        提交一个任务到对应的JobFamily              

4.调试

DumpStateToFile    dump job信息到文件
DumoStateToLog     dump job信息到日志输出

 

模块使用

1.创建ThreadManager对象:ThreadManager::Create

2.注册Job处理    threadManager->RegisterJobFamily(JobFunc, JobFuncName, ..., JobHandle),JobFunc:处理函数指针;JobFuncName:JobFamily名称;JobHandle:Job句柄,用于提交Job

3.提交Job           threadManager->PostJob(JobHandle, ..., isBlocking)    JobHandle:为RegisterJobFamily返回的JobHandle;isBlocking:表示该Thread是不是blocking执行

4.注销Job           threadManager->UnregisterJobFamily(JobFunc, JobFuncName, JobHandle) 

5.销毁ThreadManager对象:threadManager->Destroy

Camx有实际的应用可以参考,例如:DRQ


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM