Проверка Luasocket irc для получения сообщения

Я пытаюсь использовать luasocket для подключения к IRC-каналу и отправки и получения сообщений в моей игре (Wolfenstein Enemy Territory, если это поможет).

Прямо сейчас я могу сделать все это, с одной проблемой. Как только я настроил его на прослушивание сообщения, он в основном блокируется. У меня есть резервная команда, если я набираю stoplisten в Irc, она просто останавливает скрипт, и я вижу, что он получил все сообщения, но сама игра заблокирована в ожидании сообщений.

Любые идеи о том, как я могу это сделать, не замораживая игру? Я только недавно немного изучил сопрограммы, поэтому я не знаю, правильно ли я их использую. Я также должен отметить, что у меня есть доступ к функциям кадра выполнения, которые запускаются каждую миллисекунду, если это помогает (хотя обычно это делается так: if math.mod(currentTime, 50) ~= 0 then return end)

Вот часть моего кода: http://pastebin.com/j1gCqm4R (я не собирался редактировать весь свой код с отступом, чтобы разместить это здесь, поэтому я просто положил его на pastebin)


person Zelly    schedule 29.03.2013    source источник


Ответы (1)


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

Решение — неблокирующие сокеты. вызовите :settimeout(0) для вашего объекта клиентского сокета, и все будущие :send(...) :recieve(...) вернутся немедленно, либо успешно, либо по истечении времени ожидания.

справочник по LuaSocket содержит полную информацию, но вам придется изменить ваш код либо для обработки состояния сбоя "тайм-аут", либо добавьте вызовы socket.select(), чтобы убедиться, что вы используете только сокеты, которые "готовы" к использованию.

person Textmode    schedule 28.08.2013