【问题标题】:Wait for Asynchronous Event in Lua等待 Lua 中的异步事件
【发布时间】:2011-10-04 18:20:41
【问题描述】:

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

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

目前的程序流程如下所示:

[C# UI 线程]

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

[C#数据线程]

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

[C# UI 线程]

  • Lua scipt 返回解析表

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

编辑

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

【问题讨论】:

    标签: c# lua luainterface


    【解决方案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 程序员,所以我试图保持这方面的通用性。

    【讨论】:

    • 我的意思是操作系统线程。我编辑了我的帖子以使其更清楚。我只有一个 Lua 状态。我认为如果您在一个状态下运行代码,然后另一个线程尝试在同一状态下运行其他代码,Lua 不能很好地处理它?
    • 注意,您可以像使用lua_pcall 一样使用lua_resume,但请参阅我的问题以了解可能产生的潜在问题:stackoverflow.com/questions/6625698/…
    • 我似乎无法在 C# 绑定 (LuaInterface) 中找到直接与协程交互的方法。这有点像皮塔饼。
    • 这部分超出了我的专业知识范围,但是如果您将C# 添加到您的标签中,您可能会得到一些帮助。
    • 另外,由于 Lua 是为单线程环境设计的,因此您需要在 Lua 调用周围放置一个互斥锁/锁,以避免线程破坏彼此的 Lua 堆栈。
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2018-09-13
    • 2019-03-21
    相关资源
    最近更新 更多