在Lua中等待异步事件

本文关键字:异步 事件 等待 Lua | 更新日期: 2023-09-27 18:01:54

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

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

程序流程当前看起来像:

[c# UI线程]

  • 按钮点击
  • 运行脚本
    • 呼叫SendUnicast
    • 等待响应

[c# Data Thread]

  • 传入消息
    • 传递消息给Lua解析器函数
    • 如果序列匹配等待命令,存储解析表,恢复阻塞

[c# UI线程]

  • Lua脚本返回解析表

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

编辑

我将BMitch的回答标记为接受,因为这是处理这个问题的正确方法。但是,我要警告你,luinterface不支持协程,我必须自己在c#代码中添加对协程的支持。

在Lua中等待异步事件

在UI线程中运行:

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

"Wait for response"应该看起来像这样:

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

"incoming message"函数在Lua中应该是这样的:

results[cur_result]=parsed_message

最后回到C#中的"传入消息",调用相应的semaphore_post()函数。

抱歉,如果我的C#看起来很糟糕,我是Linux上的C程序员,所以我试图保持那一边的通用。