Как сделать асинхронный HTTP-вызов с обратным вызовом в Lua? - PullRequest
2 голосов
/ 27 декабря 2011

Мне нужно сделать асинхронный HTTP-вызов на мой сервер, чтобы получить XML-ответ.После того как я получу ответ, я вызову [ранее указанную] функцию, если она будет успешной, или какую-то другую функцию, если это ошибка.

Итак, в первую очередь я подумал о сопрограммах.К сожалению, после того, как я сделаю вызов http.get, я не могу уступить, поскольку он будет ждать завершения всего процесса.Я знаю, что могу использовать отдельные функции для чтения ответа, однако мне нужно подождать, по крайней мере, первые байты данных, чтобы эта функция сработала, что позволило бы дать результат.В любом случае, то, что я хочу сделать с использованием сопрограмм, не похоже на путь.

Затем я попытался вызвать функцию C из lua, создать отдельный поток для получения XML, а затем вызвать функциюв Lua, однако, это не работает из-за изменения lua_state после создания нового потока.Перед созданием потока я могу видеть 3 параметра в стеке, а после создания нового потока (я передаю lua_State в качестве аргумента) он имеет только один.В любом случае, насколько я понимаю, lua_State будет закрыт после завершения исходного вызова функции, поэтому я не смогу перезвонить.

Так как я только начинаю с lua и я еще менее знакомс привязками lua к c я могу только надеяться, что сделаю несколько глупых ошибок, и это будет легко решить.Однако пока я застрял, не зная, как продвигаться дальше.

История, стоящая за этой проблемой: я портирую свою игру из целевой инфраструктуры C Cocos2D на инфраструктуру Cocos2d-X C ++.Я хочу использовать привязки Lua, так как думаю, что не смогу перенести их на C ++.В любом случае, я хочу сделать это в Lua.Так что у меня есть сцена, где кто-то получает доступ к списку инвентаря, который у них есть в игре.Если ответ будет немедленным, они в основном увидят окно, открытое со списком инвентаря.Однако, если на получение данных [немного проблем с соединением, перегрузка ... все, что угодно] потребуется немного больше времени, и на экране отобразится некоторая анимация, указывающая на передачу данных.По крайней мере, так работает на objc-версии игры, и я хочу того же.

Есть ли что-то, что я пропустил во время исследования, возможно ли это сделать?

Кстати, я видел асинхронные вызовы Lua-сокета , и это мне не помогает, потому что он все еще ждет начала передачи, прежде чем начнет другую.

Ответы [ 2 ]

5 голосов
/ 27 декабря 2011

Что-то вроде Luvit ?

Luvit - это попытка сделать что-то сумасшедшее, взяв удивительный nodeJS архитектура и зависимости и посмотреть, как это вписывается в Lua язык.

Этот проект все еще находится в стадии разработки, но он показывает Обещаю. В начальном бенчмаркинге с сервером hello world это в 2-4 раза быстрее, чем nodeJS.

1 голос
/ 28 декабря 2011

Я смог сделать это, используя https://github.com/Neopallium/lua-llthreads Похоже, что это нормально работает на платформах iOS и Android.

...