在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#代码中添加对协程的支持。
在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
程序员,所以我试图保持那一边的通用。