等待Lua中的异步事件

时间:2011-07-13 18:44:07

标签: c# lua luainterface

我在Lua中有一个库,用于创建和解析协议的数据包。当我发送数据包时,我期待从目标回复,然后将其解析为表。我正在尝试围绕这个库编写一个包装器,以便我可以进行如下函数调用:result = SendUnicast(dest,packetData)并将解析后的响应表返回给结果。

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

程序流程目前看起来像:

[C#UI线程]

  • 按钮单击
  • 运行Lua脚本
    • 致电SendUnicast
    • 等待回复

[C#数据线程]

  • 收到的消息
    • 将消息传递给Lua解析器函数
    • 如果序列匹配等待命令,则存储已解析的表,恢复已阻止

[C#UI线程]

  • Lua scipt返回解析表

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

修改

我将MBitch的答案标记为已接受,因为这是处理此问题的正确方法。但是,我会警告你,LuaInterface不支持协同程序,我不得不自己添加对C#代码的支持。

1 个答案:

答案 0 :(得分: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程序员,所以我试图保持这方面的通用。

相关问题