wxLua - 如何实现取消按钮?
我有一个wxLua Gui应用程序,有一个“运行”按钮。根据所选选项,运行可能需要很长时间,因此我想要实现一个“取消”按钮/功能。但是看起来wxLua中的所有内容都在一个Gui线程上工作,一旦点击运行,按下取消则不起作用,运行总是被执行到完成。
取消基本上将一个变量设置为true,运行过程定期检查该变量。但是取消按钮按下事件在运行时从未发生。
我从未使用过协程;如果文件运行过程定期产生“取消检查”处理,则取消事件将会发生吗?
还是有其他方法?
(以下假设“Run”指的是在同一进程中运行长时间的操作,而不是使用 wxExecute 或 wxProcess 运行外部进程。)
“取消”事件未被触发是因为在执行你的“Run”逻辑时,你没有给 UI 处理单击事件的机会。
为了避免阻塞 UI,你需要像这样做。当你单击“Run”按钮时,创建一个协程围绕你想要运行的函数:
coro = coroutine.create(myLongRunningFunction)
此时你的“Run”事件已经完成。然后在 EVT_IDLE 事件中,只要协程没有完成,就会恢复它。它会像这样:
if coro then -- 只有在有协程要处理时才进行处理
local ok, res = coroutine.resume(coro, additional, parameters)
-- 你的函数要么暂停,要么返回
-- 你可以检查 ok 来查看是否有错误
-- res 可以告诉你进程执行到了哪一步
-- 协程可以返回多个值(只需将它们作为参数传递给 yield)
if coroutine.status(coro) == 'dead' then -- 完成或错误停止
coro = nil
-- 你需要知道这个进程已经完成了,然后做你需要做的事情
end
end
在你的进程未完成时,你可能需要请求更多的 IDLE 事件,因为一些操作系统不会触发 IDLE 事件除非有其他事件触发。假设你的处理器有“event”参数,你可以使用“event:RequestMore(true)”来请求更多的 IDLE 事件(RequestMore)。
你的长时间运行的进程将需要在正确的时间调用 coroutine.yield()(不要太短,因为你会浪费时间来回切换,也不要太长让用户注意到 UI 中的延迟);你可能需要进行实验,但在每次调用之间间隔 100ms 这样的计时器为基础的方法可能会起作用。
你可以在你的 IDLE 事件处理器或长时间运行的函数中检查取消值,就像你现在所做的那样。我描述的逻辑将给你的应用程序 UI 一个处理取消事件的机会,就像你所期望的那样。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我不使用WXWidgets,但是在使用IUP的lua脚本中,我实现取消按钮的方法是设置一个取消标志,当按钮被按下并且在运行期间检查进度显示时,将其设置。
使用方法如下:
ProgressDisplay.Start('This is my progress box',100) for i=1,100 do ProgressDisplay.SetMessage(i.." %") fhSleep(50,40) -- 模拟执行任务 ProgressDisplay.Step(1) if ProgressDisplay.Cancel() then break end end ProgressDisplay.Reset() ProgressDisplay.Close()如果您想查看ProgressDisplay的定义,请参阅:
http://www.fhug.org.uk/wiki/doku.php?id=plugins:code_snippets:progress_bar