1

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

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

程序流程目前看起来像:

[C# UI 线程]

  • 按钮点击
  • 运行 Lua 脚本
    • 调用发送单播
    • 等待响应

[C#数据线程]

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

[C# UI 线程]

  • Lua scipt 返回解析后的表

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

编辑

我将 BMitch 的答案标记为已接受,因为它是处理此问题的正确方法。然而,我会警告你,LuaInterface 不支持协程,我必须自己在 C# 代码中添加对协程的支持。

4

1 回答 1

2

在 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#看起来很糟糕,我是CLinux 上的程序员,所以我试图保持这方面的通用性。

于 2011-07-13T19:55:24.683 回答