Обновить

Модификация UI элементов не в основном потоке Unity

В настоящее время я активно изучаю и использую Unity для разработки проекта с AR и столкнулся с классической проблемой "модификации UI элементов не в основном потоке" - так делать нельзя, поскольку средой будет вызвано исключение UnityException.

В рамках изучения этого вопроса я далеко не сразу нашёл решение. Передо мной стояла задача сделать обработку сообщения, получаемого по каналу связи через WebSocket, изменив при этом некоторые UI элементы. Обработка происходит не в основном потоке.

Через некоторое время я наткнулся на одно из возможных решений этой проблемы через очередь задач, которая решает данную проблему:

// Экземпляр WebSocket
private WebSocket _ws;

// Очередь команд для обработки
private readonly ConcurrentQueue<Action> _actions = new ConcurrentQueue<Action>();

void Start()
{
    // ...
    ConnectWebSocket();
}

void ConnectWebSocket()
{
    // ...
  
    // Добавление обработчика ответа от сервера
    _ws.OnMessage += OnMessage;
  
    // ...
}

void Update()
{
  // ...
  while (_actions.Count > 0)
  {
    if (_actions.TryDequeue(out var action))
    {
      // Выполнение задачи из очереди
      action?.Invoke();
    }
  }
}

void OnMessage(object sender, MessageEventArgs e)
{
  // Добавление команды в очередь
  _actions.Enqueue(() => MessageHandler(sender, e));
}

void MessageHandler(object sender, MessageEventArgs e)
{
  // Данный блок кода выполняется в основном (main) потоке
}

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии1

Зуд от укуса комара или мошки — лютый биохимический прикол

Предположим, вас укусил комар прямо в попу.

Что там, вы не видите, но зудит, поэтому вы чешетесь. То есть прям берёте и начинаете водить ногтями по месту укуса. До тех пор, пока это отвратительное состояние зуда в моменте не пройдёт.

Прикол в том, что почесаться надо достаточно сильно, чтобы боль от царапин перекрыла сигнал зуда в спинном мозге. Тогда вы чувствуете облегчение на несколько секунд. Но механическое воздействие на это место усиливает выброс гистамина и цитокинов, и раздражение становится сильнее. А раздражение — главная причина зуда.

Есть ещё невероятный прикол с серотонином в этой же цепочке, но про него чуть позже.

Боль вообще-то — технология отрицательной обратной связи. Не делай, чтобы тебе не было больно. Не трогай горячее; не выгибай вот так руку; береги пораненную ногу; не бей организмом по кокосу, бей лучше камнем и так далее.

Зуд от укуса комара даёт положительную обратную связь. Чем больше зудит, тем больше зудит.

Часто бывает, что 90% итогового воспалительного процесса — это не комар и его токсины, это мы своими ногтями.

Соответственно, если вы хотите, чтобы что-то на коже заживало, нужно успокоить пользователя, отключить чувствительность в первую очередь. Потом убрать раздражение на уровне сигнальных молекул (загасить цитокиновый микрошторм). Потом уже можно заниматься починкой структуры и полирнуть сверху защитным барьером, потому что сухой роговой слой сам по себе раздражает рецепторы.

И вот у нашей лаборатории появилась задача это всё собрать. Опыт за 30 лет накопился, в регенерации тканей мы уже хорошо разбираемся, но прошло не без сюрпризов.

Зуд от укуса комара или мошки — лютый биохимический прикол

Публикации