BroadcastChannelSubscribe

From SunFlurry wiki
Revision as of 11:30, 4 January 2026 by 1>Admin
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  BroadcastChannelSubscribe (Доставка сообщений)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в число, строку, ошибка сервера
Визуальность:Нет

Функция подписывается на сообщения глобального канала сообщений, заданного по его имени (первый аргумент). Если указана форма-получатель сообщений, они будут приходить в виде события OnMessage (OnMessage) в момент, когда форма ожидает действий пользователя (idle). Если форма не указана, программе необходимо получать сообщения самостоятельно с помощью функции BroadcastChannelReceiveMessage. Подписка действует для текущего потока, если сообщения не забираются, они будут накапливаться на сервере. Для отказа от подписки, используйте BroadcastChannelUnsubscribe. Подписка удаляется автоматически, когда поток с подпиской заканчивает работу. Если указана форма и она будет закрыта, но поток продолжит работать, подписка не будет отменена (однако сообщения приходить не будут, так как отсутствует форма). Функция возвращает цифровой идентификатор канала, по которому к нему можно выполнять обращения (чуть быстрее, чем по имени). Идентификатор корректен до момента вызова BroadcastChannelUnsubscribe или завершения потока подписки.

Синтаксис

BroadcastChannelSubscribe(<Имя канала (STRING)>,<Форма-получатель или ее серийный номер (FORM,INT)>=0):<Числовой идентификатор канала (INT)>

Аргументы

  • <Имя канала (STRING)> - Произвольное имя канала для подписки.
  • <Форма-получатель или ее серийный номер (FORM,INT)> - (необязательный аргумент) Указание на форму, если необходимо поулчать сообщения в виде события OnMessage. Форма может быть задана серийным номером или самим объектом формы.

Возвращаемое значение

Возвращает числовой идентификатор канала на сервере.

Примеры

//Пример простого отправителя и подписчика в одном фрагменте текста.

  Function Подписчик()
    аКодКанала:=BroadcastChannelSubscribe("Канал");
    аНум:=0;
    While 1 Do
      If not BroadcastChannelReceiveMessage(аКодКанала,100,аНум) Then
        Continue;
      EndIf;
      Message("Получено сообщение с ID "+аНум);
      If аНум=100 Then
        Break;
      EndIf;
    EndDo;
    BroadcastChannelUnsubscribe(аКодКанала);
    Message("Поток закончил работу...");
  EndFunction

Mutex.ExecuteFunctionInSeparateThread("Подписчик",0);

аКодКанала:=BroadcastChannelSubscribe("Канал");
ИдСообщения:=1;
While ИдСообщения<=100 Do
  If BroadcastChannelSendMessage(аКодКанала,ИдСообщения,"")>0 Then
    ИдСообщения:=ИдСообщения+1;
  EndIf;
EndDo;
//Ожидания завершения потока после принятия сообщения 100
//Без этой паузы, поток можен быть завершен форсировано, так как текущий (родительский) поток будет завершен
Sleep(1000);

//Будет выведено:
//Получено сообщение с ID 1
//Получено сообщение с ID 2
//..
//Получено сообщение с ID 100
//Поток закончил работу...