在不停止整个程序的情况下休眠 Lua 脚本?

Posted

技术标签:

【中文标题】在不停止整个程序的情况下休眠 Lua 脚本?【英文标题】:Sleep Lua script without halting entire program? 【发布时间】:2011-06-05 15:27:49 【问题描述】:

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

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

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

【问题讨论】:

答案其实很简单,虽然效率不高。我在 C++ 中创建了一个忙等待的函数,在忙等待中我运行了函数来更新 GUI。不过,我仍然想听听是否有人有更有效的答案。 为什么要让脚本休眠?你想用它完成什么? 抱歉回复晚了。我只是想制作一个简单的 Sleep() 函数,它只影响 lua 脚本,而不是整个程序。基本上,lua 脚本将使用 C++ 创建的函数,这些函数看起来像 CreateWindow(texture,x,y,width,height) RotateWindow(45) 等。我正在制作 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 中执行的操作。

【讨论】:

以上是关于在不停止整个程序的情况下休眠 Lua 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Google Sheet Script:有没有办法在不停止脚本的情况下显示消息?

如何在不使用 ctrl-c 的情况下停止烧瓶应用程序

Visual C++/Cli 中的异步睡眠,如何在不使 GUI 停止的情况下创建一个 X 毫秒来调用函数

按下按钮时如何在 lua 脚本中停止重复?

Pentaho Kettle - 在不停止作业的情况下运行检查数据库连接

如何在不停止 laravel 程序的情况下使用 dd()