【问题标题】:Sleep Lua script without halting entire program?在不停止整个程序的情况下休眠 Lua 脚本?
【发布时间】:2023-04-04 17:49:02
【问题描述】:

我正在编写一个易于最终用户自定义的 GUI。这些函数在 C++ 中并从 Lua 调用。我正在尝试制作一个可以暂停脚本而不是程序本身的 Sleep() 类型函数。

我能够通过使用线程并为每个函数制作一个线程来使其工作。但是,我希望它是一个单独的功能。例如,与其将其作为 CreateButton 函数和其他所有函数的一部分,不如将其包含在仅暂停脚本而非整个程序的 Delay 或 Sleep 函数中。

我是 Lua 的新手,我真的不知道该怎么做。任何帮助表示赞赏。

【问题讨论】:

  • 答案其实很简单,虽然效率不高。我在 C++ 中创建了一个忙等待的函数,在忙等待中我运行了函数来更新 GUI。不过,我仍然想听听是否有人有更有效的答案。
  • 为什么要让脚本休眠?你想用它完成什么?
  • 抱歉回复晚了。我只是想制作一个简单的 Sleep() 函数,它只影响 lua 脚本,而不是整个程序。基本上,lua 脚本将使用 C++ 创建的函数,这些函数看起来像 CreateWindow(texture,x,y,width,height) RotateWindow(45) 等。我正在制作 Sleep() 函数,以便如果我或最终用户想要一个在创建窗口和旋转窗口之间暂停,我们可以在不中断整个程序的情况下做到这一点。

标签: lua sleep


【解决方案1】:

我会考虑使用协程和消息传递来制作状态机。将每个按钮按下视为传递给协程恢复的 c++ 字符串。然后,您可以构建一个打开消息的小型状态机。然后你可以做一些 UI 工作,然后让协程重新进入睡眠状态,直到有东西向它发送另一条消息。

如果您有一个执行 UI 的状态机,这将非常方便。

伪代码:

c_obj:wait_for_message("mouse_down");
local message = coroutine.yield();
if(message == "mouse_down") then
  update draw function.
end
c_obj:wait_for_message("mouse_up");
local message = coroutine.yield();
if(message == "mouse_up") then
  Update UI..
  update draw function.
end 
etc...

【讨论】:

    【解决方案2】:

    为了让您的忙等待解决方案更高效,使用select() 或类似的方法来等待一些GUI 事件处理,而不是旋转如何?无论脚本方面如何,这似乎都是您需要在 GUI 中执行的操作。

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多