Lua 从服务器接收数据时出错
我想让下面的测试函数打印出消息“k不是nil”,但我的代码不起作用。它已经从我的服务器收到了k值,但是如果k~=nil,它就不会检查行。下面是我的代码。谢谢你的建议Lua 从服务器接收数据时出错,lua,coronasdk,Lua,Coronasdk,我想让下面的测试函数打印出消息“k不是nil”,但我的代码不起作用。它已经从我的服务器收到了k值,但是如果k~=nil,它就不会检查行。下面是我的代码。谢谢你的建议 local function receiveData( ) local l,e = client:receive() if l~=nil then print(l) return l,e else timer.performWithDelay(100,rece
local function receiveData( )
local l,e = client:receive()
if l~=nil then
print(l)
return l,e
else
timer.performWithDelay(100,receiveData)
end
end
function test( )
k = receiveData()
if k ~=nil then
print("k isn't nil")
end
end
test()
你确定你收到了数据吗?您的程序在控制台中打印什么
你可以考虑以下修改<
local function receiveData( )
local l,e = client:receive()
if l~=nil then
print(l)
return l,e
else
timer.performWithDelay(100,function() l, e = receiveData() end)
end
return l, e
end
所以我猜想,当第二次调用receiveData时,您的返回值(l,e)将被丢弃(因为performWithDelay与它们无关)。问题是,如果第一次尝试时未收到数据,则k为零,测试返回。在收到数据之前,
receiveData
将以100毫秒的间隔再次调用,但返回将被performWithDelay丢弃,然后test
已返回(请参阅此答案的第一句话)
解决方案是设置一个回调,当数据最终到达时,receiveData
可以调用该回调。然后回调可以处理数据。将返回l,e
替换为onReceiveData(l,e)
,并让其在循环中执行测试等待的操作。当然,receiveData
可以直接设置这个标志,让测试监视,但一旦你的应用程序变大,最好将接收和处理分开
function receiveData()
...
-- then:
local data = nil
function onReceiveData(l,e)
data = l
print('ready to process data', data, e)
end
funtion test()
receiveData()
while data == nil do sleep(100) end
print('data received and processed')
end
test()
其中sleep(100)
是您可以想到的,因为在Lua甚至Corona中都没有内置函数来实现这一点(尽管Corona有system.getTimer()
,它在应用程序启动后返回ms,所以您可以
function sleep(ms)
local start = system.getTimer()
while system.getTimer() - start < ms do
end
end
功能睡眠(毫秒)
local start=system.getTimer()
而system.getTimer()-start
我不太喜欢空while循环,但在一个测试实用程序函数中它是可以的。如果您使用的是套接字库,它有一个睡眠功能——请查看以获取其他选项)。Hi vetham,我确信收到了数据,因为它打印了我正确发送的值,但不知道为什么它没有在测试()中打印函数。你试过我的修改吗?嗨,维瑟姆,我试过在我的测试函数中编写新函数,方法是让k=client:receive()可以工作。我也不明白为什么上面的代码不起作用。如果您认为答案应该改进以获得投票权,请发表评论,谢谢!