zoukankan      html  css  js  c++  java
  • unimrcp apt task

    • TASK

    apt_task_create(void *obj, apt_task_msg_pool_t *msg_pool, apr_pool_t *pool)

    apt_task_destroy(apt_task_t *task)销毁任务及所有子任务

    apt_task_add(apt_task_t *task, apt_task_t *child_task)加入一个子任务

    apt_task_start(apt_task_t *task)如果vtable.start存在,则运行之,否则以apt_task_run()为线程入口创建并启动新的线程。apt_task_run()按照vtable.on_pre_run() /apt_task_child_start()/vtable.run()/vtable.on_post_run()的顺序来执行

    apt_task_terminate(apt_task_t *task, apt_bool_t wait_till_complete) 执行vtable.terminate,如wait_till_complete则执行join

    apt_task_delay(apr_size_t msec) sleep

    apt_task_parent_get(const apt_task_t *task)

    apt_task_pool_get(const apt_task_t *task)

    apt_task_object_get(const apt_task_t *task)获得create()时传入的userdata

    apt_task_vtable_get(apt_task_t *task)获得可写的vtable

    apt_task_name_get(const apt_task_t *task)

    apt_task_msg_get(apt_task_t *task)从task的message pool获得一个message,内部通过pool.acquire_msg()获得

    apt_task_msg_release(apt_task_msg_t *task_msg)

    apt_task_msg_signal(apt_task_t *task, apt_task_msg_t *msg)通过vtable.signal_msg发送消息

    apt_task_msg_parent_signal(apt_task_t *task, apt_task_msg_t *msg)通过parent的vtable.signal_msg发送消息

    apt_task_msg_process(apt_task_t *task, apt_task_msg_t *msg)处理TASK_MSG_CORE和TASK_MSG_USER消息,如果是TASK_MSG_USER消息,则用vtable.process_msg()处理

    apt_task_child_start(apt_task_t *task) 执行vtable.on_start_request(),并对所有子任务调用apt_task_start(). 当所有子任务都跑起来以后,表示当前任务已经跑起来,执行vtable.on_start_complete(),并向自己的父任务发送启动完成消息(CORE_TASK_MSG_START_COMPLETE)。子任务通知父任务已启动是用apt_task_start_complete_raise()函数向父任务发送CORE_TASK_MSG_START_COMPLETE来达到的。

    apt_task_child_terminate(apt_task_t *task) 执行vtable.on_terminate_request(),并对所有子任务调用apt_task_terminate(),当所有子任务结束后,执行vtable.on_terminate_complete()并向自己的父任务发送结束完成消息

     apt_task_auto_ready_set(apt_task_t *task, apt_bool_t auto_ready) 设置自动启动子任务开关

    apt_task_running_flag_get(apt_task_t *task) 检查任务是否在running状态

    apt_task_start_request_remove(apt_task_t *task) 应该是给自定义任务使用的工具函数,用于通知检查自己是否启动完成,如是,执行vtable.on_start_complete()以及通知父任务

    apt_task_terminate_request_add(apt_task_t *task) 类上

    apt_task_terminate_request_remove(apt_task_t *task)类上

    • Message

    typedef enum {
        TASK_MSG_CORE,                   /**< core task message type */ 用于传递任务管理相关的消息,不应用于业务逻辑处理
        TASK_MSG_USER                    /**< user defined task messages start from here */
    } apt_task_msg_type_e;

    /** Task message is used for inter task communication */
    struct apt_task_msg_t {
        /** Message pool the task message is allocated from */
        apt_task_msg_pool_t *msg_pool;
        /** Task msg type */
        int                  type;
        /** Task msg sub type */
        int                  sub_type;
        /** Context specific data */
        char                 data[1];
    };

    apt_task_msg_pool_create_dynamic(apr_size_t msg_size, apr_pool_t *pool); 创建一个以msg_size为message大小的message pool. 其内部空间还是用的参数中的pool,只是根据msg_size包装了一下acquire_msg()和release_msg

    apt_task_msg_pool_destroy(apt_task_msg_pool_t *msg_pool);

    apt_task_msg_acquire(apt_task_msg_pool_t *task_msg_pool);

    apt_task_msg_release(apt_task_msg_t *task_msg);

    • consumer task

    apt_consumer_task_create(void *obj, apt_task_msg_pool_t *msg_pool, apr_pool_t *pool) 创建一个apt_task,vtable.run = apt_consumer_task_run; vtable.signal_msg=apt_consumer_task_msg_signal. 同时会创建一个apr_queue用于放收到的消息(apr_queue是线程安全的)。

    apt_consumer_task_base_get(const apt_consumer_task_t *task) 返回apt_task

    apt_consumer_task_vtable_get(apt_consumer_task_t *task) 返回apt_task的vtable

    apt_consumer_task_object_get(const apt_consumer_task_t *task) 获得创建时传入的userdata

    apt_consumer_task_msg_signal(apt_task_t *task, apt_task_msg_t *msg) 从apt_task获得consumer_task,然后利用apr_queue_push()把message放到队列中

    apt_consumer_task_run(apt_task_t *task)中队列中取出消息并执行apt_task_msg_process();

    从中可以看出,consumer task只是增加了一个消息队列。而基础的apt_task的vtable.signal_msg()是没有实现的

  • 相关阅读:
    Scrapy的架构与原理的理解【转】
    Scrapy框架的命令行详解【转】
    WPF 程序中启动和关闭外部.exe程序
    C++ 二维数组(双重指针作为函数参数)
    C++ 遇见的一些函数
    C++ #pragma 预处理指令
    C++异常处理(Exception Handling)
    C++模板学习随笔
    C++ 数组的地址问题学习随笔
    关于C++几个容易混淆的概念总结
  • 原文地址:https://www.cnblogs.com/jan4984/p/3607104.html
Copyright © 2011-2022 走看看