整体介绍如下:
一、服务器启动与请求处理
- 服务器(Server类)启动时,在其构造函数中进行 Windows 平台的网络初始化设置,然后在start方法中创建事件基础对象、HTTP 对象,并设置路由。
- 设置路由时,将不同的 API 端点(如
/api/controls、/api/control/add等)与相应的处理函数关联起来。这些处理函数在接收到 HTTP 请求时,会解析请求参数,并调用调度器(Scheduler类)的相应方法来执行具体操作。
- 设置路由时,将不同的 API 端点(如
二、调度器与服务器的交互
- Server类在处理 HTTP 请求时,依赖Scheduler类来执行与控制任务相关的操作。
- 例如,当处理添加控制任务的请求时,
Server类会调用Scheduler的apiControlAdd方法。这个方法会检查任务是否已在运行、是否超过工作线程并发限制等条件,如果满足条件,会创建一个新的工作线程(Worker类实例)来执行控制任务。 - 对于获取控制信息的请求,
Server类调用Scheduler的apiControls方法,该方法会遍历工作线程映射,将所有正在运行的控制任务信息返回给Server,然后Server将这些信息以 JSON 格式返回给客户端。
- 例如,当处理添加控制任务的请求时,
三、调度器与工作线程的交互
- Scheduler作为调度中心,管理着工作线程(Worker)。
- 在初始化阶段,
Scheduler的initAlgorithm方法根据配置文件中的算法引擎参数初始化算法模型,创建AlgorithmOpenVINO或AlgorithmTensorRT对象,这些算法对象可供工作线程在执行控制任务时使用。 - 当有新的控制任务添加时,
Scheduler创建一个新的Worker实例,并通过addWorker方法将其添加到工作线程映射中。同时,工作线程在构造函数中接收一个指向Scheduler的指针,以便在执行任务过程中与Scheduler进行交互,例如获取算法模型(通过gainAlgorithm和giveBackAlgorithm方法)。 - 当需要取消控制任务时,
Server调用Scheduler的apiControlCancel方法,该方法会从工作线程映射中移除对应的Worker实例,并等待其资源被释放。
- 在初始化阶段,
四、工作线程与其他模块的交互
Worker类与控制任务(Control类):工作线程持有一个指向Control类的指针,用于执行具体的控制任务。Control类包含了任务的相关参数,如代码、流地址、算法代码、对象代码等,工作线程根据这些参数来执行特定的任务操作。Worker类与算法模型:工作线程在执行控制任务过程中,向Scheduler请求算法模型进行算法处理。根据Scheduler返回的算法对象(可能是AlgorithmOpenVINO或AlgorithmTensorRT实例),调用相应的算法方法来处理任务数据。Worker类与拉取流(Pullstream类)和推送流(Pushstream类):工作线程使用Pullstream类拉取输入流,根据Control类中的配置信息确定数据源。处理完数据后,使用Pushstream类推送处理后的输出流,同样根据Control类中的配置信息确定推送目标地址。Worker类与报警处理:如果在执行控制任务过程中发生报警事件,工作线程会创建一个Alarm对象并传递给Scheduler进行处理。
五、报警处理的交互
- 工作线程在执行控制任务时,如果发生报警事件,会创建一个Alarm对象并传递给Scheduler
Scheduler将报警对象添加到报警队列(mAlarmQ)中。Scheduler的处理报警线程(由mLoopAlarmThread指向)会不断从报警队列中获取报警对象,并调用生成报警视频的函数进行处理。