2013-01-07 48 views
3

我是LUA的新手,我正在使用Corona SDK在LUA中编写一个tcp消息库。即使它在协同程序中运行,我仍然遇到一个问题,即套接字读取操作会挂起应用程序UI。如何在Corona SDK Lua中运行阻塞操作?

如何启动协同程序:

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线程)。 有没有可能从套接字读取没有阻止用户界面?例如使用真正的线程或异步方法?谢谢。

P.S.消除BUFSIZ是不是因为我不希望有UI受阻于一切,甚至0.2..0.4秒(慢速移动网络延迟)选项

回答

1

电晕具有异步调用API network.request ..

如果你不想使用它,请看看this asynchronous http library

+0

不幸的是,它执行HTTP请求,但我需要直接使用套接字。 – ZAN

+0

第二个链接呢?我没有彻底地通过它,但它似乎是使用套接字连接.. – SatheeshJM

+0

第二个来源真的包含一个异步解决方法,谢谢。我会尝试使用它来编译更多的东西。 – ZAN

0

基于由发布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 

重要事项一消息类:

  1. self.sock: settimeout(0)需要使插座非阻塞
  2. 本地数据,状态,rest = self.sock:receive() < - 在出现“timeout”错误时,大多数数据中的数据都将处于“rest”变量,这就是为什么我们需要下面的检查来了解数据传输的准确性