У меня есть исполняемый исполняемый файл Lua-интерпретатора с встроенной встроенной функциональностью сокетов. Это не Luasocket, и насколько бы я хотел использовать Luasocket здесь, t (поэтому, пожалуйста, не предлагайте это как ответ).Как сделать функциональный блок Lua до тех пор, пока не будет вызвано замыкание
API-интерфейс сокета, с которым я работаю, опирается на асинхронные замыкания, чтобы сигнализировать о завершении сетевой операции. Итак, в приведенном ниже коде socketConnect()
немедленно возвращается, а затем onConnect()
вызывается позже, когда соединение завершено.
local function onConnect(cookie, err, sock)
print("Connected!")
end
local function connect(host, port)
local success, err = socketConnect(host, port, onConnect)
print("Connecting...")
end
Итак, вот вопрос. Я хочу сделать функциональный блок connect()
до тех пор, пока не будет вызвано замыкание onConnect()
. Я довольно новичок в Lua, но я надеюсь, что сопрограммы могут быть полезны здесь?
EDIT: Вот моя попытка сделать функциональный блок с помощью сопрограммы:
local connected = false
local function onConnect(cookie, err, sock)
print("Connected!")
connected = true
end
local coroConnect = coroutine.create(
function()
local success, err = socketConnect(m_sHost, m_nPort, onConnect);
while not connected do
coroutine.yield()
end
end
)
local function connect(sHost, nPort)
m_sHost = sHost
m_nPort = nPort
while not coroutine.status(coroConnect) ~= "dead" do
coroutine.resume(coroConnect)
print("Connecting...")
end
end
Lua не поддерживает многопоточные или асинхронные обратные вызовы, поэтому либо «socketConnect» вызывает обратный вызов перед его возвратом, либо код использует некоторое многопоточное расширение, и в этом случае было бы полезно узнать, какой из них. –
My * custom * Lua interpreter имеет рабочий поток, из которого вызывается обратный вызов. Если бы я вызвал вышеуказанный connect(), выход для печати был бы «Подключение ... Подключено!» – mikejonesguy