Lua中等待异步事件

我在Lua中编写了一个库,用于创建和解析协议数据包。当我发送一个数据包时,我期望从目的地收到一个回复,然后将其解析为一个表。我试图编写一个包装器来调用以下函数:result = SendUnicast(dest,packetData)并使解析后的响应表返回到结果。

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

目前的程序流程如下:

[C# UI线程]

  • 按钮单击
  • 运行Lua脚本
    • 调用SendUnicast
    • 等待响应

[C# 数据线程]

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

[C# UI线程]

  • Lua脚本返回解析的表

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

编辑

我将BMitch的答案标记为被接受的答案,因为它是处理此问题的正确方法。但是,我要警告您,LuaInterface不支持协程,我不得不自己向C#代码添加支持。

原文链接 https://stackoverflow.com/questions/6683928

点赞
stackoverflow用户596285
stackoverflow用户596285

在 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 程序员,所以尝试让那边保持通用。

2011-07-13 19:55:24