我在Lua中有一个库,用于创建和解析协议的数据包。当我发送数据包时,我期待从目标回复,然后将其解析为表。我正在尝试围绕这个库编写一个包装器,以便我可以进行如下函数调用:result = SendUnicast(dest,packetData)
并将解析后的响应表返回给结果。
我的问题有两个:1)传入的消息异步进入并且在与执行脚本不同的线程上2)我收到的下一个数据包不一定是我的请求的响应,我必须解析传入数据包并匹配序列ID。
程序流程目前看起来像:
[C#UI线程]
[C#数据线程]
[C#UI线程]
我似乎无法找到阻止当前正在执行的脚本的好方法(在UIThread中)。在解析消息时创建要调用的协程,然后while coroutine.status(co) ~= "dead"
似乎会杀死我的lua解释器。
修改
我将MBitch的答案标记为已接受,因为这是处理此问题的正确方法。但是,我会警告你,LuaInterface不支持协同程序,我不得不自己添加对C#代码的支持。
答案 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
程序员,所以我试图保持这方面的通用。