2011-07-13 51 views
0

我在Lua中有一个库,它为协议创建并解析数据包。当我发送一个数据包时,我期待从目的地回复一个答案,然后解析成一个表格。我试图在这个库中编写一个包装器,以便我可以进行如下函数调用:result = SendUnicast(dest,packetData)并将解析的响应表返回给结果。在Lua中等待异步事件

我的问题有两个:1)传入的消息异步进入和执行脚本不同的线程和2)我收到的下一个数据包不一定是我的请求的响应,我必须解析传入数据包并匹配序列号。

程序流程目前看起来是这样的:

[C#UI线程]

  • 按钮单击
  • 运行的Lua脚本
    • 呼叫SendUnicast
    • 等待回应

[C#数据螺纹]

  • 输入消息
    • 通行证消息到Lua解析器函数
    • 如果序列匹配等待命令,存储解析表,恢复封锁

[C#UI主题]

  • 的Lua素文字回报分析表

我似乎无法找到阻止当前正在执行的脚本(UIThread)的好方法。创建协调程序,当消息被解析时调用,然后while coroutine.status(co) ~= "dead"似乎杀死我的lua解释器。

编辑

我标志着BMitch的答案接受,因为它是处理这个问题的正确方法。然而,我会警告你,LuaInterface不支持协程,我不得不自己为它们添加对C#代码的支持。

回答

1

在UI线程,运行:

while ((status=lua_resume(L_coroutine, 0)) == LUA_YIELD) { 
    semaphore_wait(); /* whatever the appropriate C# call is */ 
} 

“等待回应” 应该是这个样子:

while not results[my_result] do 
    coroutine.yield() 
end 

的 “传入的消息” 功能应该看起来像在Lua如下:

results[cur_result]=parsed_message 

最后回到C#作为“传入消息”,调用适当的semaphore_post()功能。

对不起,如果我的C#看起来很糟糕,我是一个在Linux上的C程序员,所以我试图保持通用性。

+0

我的意思是操作系统线程。我编辑我的帖子,使其更清晰。我只有一个Lua国家。我认为,如果你在一个状态上运行代码,然后另一个线程试图在同一状态下运行其他代码,Lua处理不好。 – kyork

+0

@kyork,我已更新OS线程。 – BMitch

+0

请注意,您可以像使用'lua_pcall'一样使用'lua_resume',但请参阅我的问题以了解可能会产生的问题:http://stackoverflow.com/questions/6625698/how-to-handle-errors-when-恢复-Lua线程协程 – BMitch