1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/slyant-TaskMsgBus

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 5.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 15:47 4f32162

В запросе представлен текст на языке C.

Перевод текста на русский язык:

В пользовательском файле *.c реализовать этот хук-функцию, например:

void *msg_3_dup_hook(void *args)
{
    struct msg_3_def *msg_3 = (struct msg_3_def *) args;
    struct msg_3_def *r_msg_3 = rt_calloc(1, sizeof(struct msg_3_def));
    if (r_msg_3 == RT_NULL)
    {
        return RT_NULL;
    }

    rt_memcpy((rt_uint8_t *) r_msg_3, (rt_uint8_t *) msg_3, sizeof(struct msg_3_def));
    if (msg_3->buffer && msg_3->buffer_size > 0)
    {
        r_msg_3->buffer = rt_calloc(1, msg_3->buffer_size);
        if (r_msg_3->buffer == RT_NULL)
        {
            rt_free(r_msg_3);
            return RT_NULL;
        }
        rt_memcpy(r_msg_3->buffer, msg_3->buffer, msg_3->buffer_size);
        r_msg_3->buffer_size = msg_3->buffer_size;
    }

    return r_msg_3;
}
void msg_3_release_hook(void *args)
{
    struct msg_3_def *msg_3 = (struct msg_3_def *) args;
    if (msg_3->buffer)
        rt_free(msg_3->buffer);
}
  • Инициализация:
task_msg_bus_init(); //инициализировать сообщения шины, уже импортировано в функцию автоматического инициализации компонента INIT_COMPONENT_EXPORT(task_msg_bus_init)

Вызов этой функции динамически создаст один поток рассылки сообщений шины.

  • Подписка на сообщение (можно использовать этот метод для обработки задач, не требующих ресурсов в обратных вызовах):
static void net_reday_callback(task_msg_args_t args)
{
    LOG_D("[net_reday_callback]:TASK_MSG_NET_REDAY => args->msg_name:%d, args->msg_obj:%s", args->msg_name, args->msg_obj);
}

task_msg_subscribe(TASK_MSG_NET_REDAY, net_reday_callback);
  • Отмена подписки на сообщение:
task_msg_unsubscribe(TASK_MSG_NET_REDAY, net_reday_callback);
  • Публикация сообщения:

Без содержимого сообщения:

task_msg_publish(TASK_MSG_OS_REDAY, RT_NULL);

Текстовое/JSON сообщение:

char msg_text[50];
rt_snprintf(msg_text, 50, "{\"net_reday\":%d,\"ip\":\"%s\",\"id\":%ld}", 1, "10.0.0.20", i);
task_msg_publish(TASK_MSG_NET_REDAY, msg_text);

Сообщение типа структуры (без динамического выделения памяти для внутренних полей):

struct msg_2_def msg_2;
msg_2.id = i;
rt_snprintf(msg_2.name, 8, "%s\0", "hello");
task_msg_publish_obj(TASK_MSG_2, &msg_2, sizeof(struct msg_2_def));

Сообщение типа структуры (с динамическим выделением памяти для внутренних полей):

const char buffer_test[32] = {
    0x0F, 0x51, 0xEE, 0x89, 0x9D, 0x40, 0x80, 0x22, 0x63, 0x44, 0x43, 0x39, 0x55, 0x2D, 0x12, 0xA1,
    0x1C, 0x91, 0xE5, 0x2C, 0xC4, 0x6A, 0x62, 0x5B, 0xB6, 0x41, 0xF0, 0xF7, 0x75, 0x48, 0x05, 0xE9
};

struct msg_3_def msg_3;
msg_3.id = i;
rt_snprintf(msg_3.name, 8, "%s\0", "slyant");
msg_3.buffer = rt_calloc(1, 32);
rt_memcpy(msg_3.buffer, buffer_test, 32);
msg_3.buffer_size = 32;
task_msg_publish_obj(TASK_MSG_3, &msg_3, sizeof(struct msg_3_def));
rt_free(msg_3.buffer);
  • Блокировка потока для приёма сообщений:

Приём определённого сообщения:

static void msg_wait_thread_entry(void *params)
{
    rt_err_t rst;
    task_msg_args_t args;
    //создать подписчика на сообщения
    int subscriber_id = task_msg_subscriber_create(TASK_MSG_NET_REDAY);
    if(subscriber_id < 0) return;

    while(1)
    {
        rst = task_msg_wait_until(subscriber_id, 50, &args);
        if(rst==RT_EOK)
        {
            LOG_D("[task_msg_wait_until]:TASK_MSG_NET_REDAY => args.msg_name:%d, args.msg_obj:%s", args->msg_name, args->msg_obj);
            rt_thread_mdelay(200);//имитировать ресурсоёмкую операцию, во время которой опубликованные сообщения не будут потеряны
            //освободить сообщение
            task_msg_release(args);
        }
        else
        {
            //можно выполнить другие операции, во время которых опубликованные сообщения не будут потеряны
        }
    }
}

rt_thread_t t_wait = rt_thread_create("msg_wt", msg_wait_thread_entry, RT_NULL, 512, 17, 10);
rt_thread_startup(t_wait);

Одновременный приём нескольких определённых сообщений:

static void msg_wait_any_thread_entry(void *params)
{
    rt_err_t rst;
    task_msg_args_t args = RT_NULL;
    const enum task_msg_name name_list[4] = {TASK_MSG_OS_REDAY, TASK_MSG_NET_REDAY, TASK_MSG_2, TASK_MSG_3};
    //создать много подписчиков на сообщения
    int subscriber_id = task_msg_subscriber_create2(name_list, sizeof(name_list)/sizeof(enum task_msg_name));
    if(subscriber_id < 0) return;

    while(1)
    {
        rst = task_msg_wait_until(subscriber_id, 50, &args);
        if(rst==RT_EOK)
        {
            if(args->msg_name==TASK_MSG_OS_REDAY)
            {
                LOG_D("[task_msg_wait_any]:TASK_MSG_OS_REDAY => msg_obj is null:%s",

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/slyant-TaskMsgBus.git
git@api.gitlife.ru:oschina-mirror/slyant-TaskMsgBus.git
oschina-mirror
slyant-TaskMsgBus
slyant-TaskMsgBus
master