我是LUA的新手,我正在使用Corona SDK用LUA编写一个tcp消息库。我坚持一个问题,套接字读取操作挂起应用程序UI,即使它在协程中运行。
如何启动协程:
function Messaging:readLoop()
self.readCoroutine = coroutine.create(function() self:blockingLoop() end)
coroutine.resume(self.readCoroutine)
end阻塞循环:
function Messaging:blockingLoop()
line,err,rest = self.sock:receive(BUFSIZE) -- <= Hangs UI if there is no incoming data
end当然,我知道协程并不等同于线程,但我预计LUA解释器在阻塞操作时会切换到另一个协程(就像GIL中的Python线程)。有没有可能在不阻塞UI的情况下从套接字读取数据?例如,使用真正的线程或异步方法?谢谢。
另外,消除BUFSIZ不是我的选择,因为我根本不想让UI被阻止,即使是0.2..0.4秒(缓慢的移动网络延迟)
发布于 2013-01-08 06:52:44
Corona contains LuaSockets可以让你进行异步套接字通信,如here所示。
发布于 2013-01-08 04:56:28
Corona有一个用于异步调用的network.request应用程序接口。
如果你不想使用它,可以看看this asynchronous http library。
发布于 2013-01-09 04:03:49
基于Mud和SatheeshJM发布的链接,我最终制作了一个可能对某些人有帮助的消息传递类
-- Messaging prototype
Messaging = {sock = nil, sockTimer = nil}
-- Messaging constructor
function Messaging:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Messaging:connect()
self.sock = socket.tcp()
print( self.sock:connect(HOST, PORT) )
self.sock:settimeout(0)
self.sockTimer = timer.performWithDelay(50, function() self:checkData() end, 0)
end
function Messaging:close()
timer.cancel(self.sockTimer)
self.sock:close()
end
function Messaging:checkData()
local data, status, rest = self.sock:receive()
local s
if data then
s = data
else
s = rest
end
if s:len() ~= 0 then
print ('received', s)
end
end重要注意事项:
使套接字rest所需的数据,状态,rest= self.sock:receive() <-在大多数情况下,当出现“non-blocking
https://stackoverflow.com/questions/14203163
复制相似问题