【发布时间】:2021-05-08 20:47:16
【问题描述】:
我目前正在创建自己的基于 SFML 的 GUI-Library。 目前我正在研究一个按钮。因此,在创建按钮时,您还必须指定一个回调,它是一个函数,在按钮单击时执行。
现在,我要回答我只使用指向函数的指针作为按钮回调的缺点是什么,因为我不知道任何流行的 GUI 库也可以这么简单地做到这一点。 如果回调函数是一个很长的过程,我会在一个新线程中执行它,但我现在不确定。
那么,不使用这种简单解决方案的原因是什么,尤其是更好的方法是什么?
【问题讨论】:
-
正如您所指出的,如果该函数执行任何重要的工作,它将导致用户界面冻结,用户讨厌。这就是为什么大多数 GUI 库都有一个专门的 UI 线程,并且不允许在该线程中做任何“繁重”的事情。我认为大多数现代 GUI 库都使用某种事件队列系统(最终可以使其他功能更易于实现,例如撤消/重做)。
-
我建议使用 lambda 闭包指定回调。这样,由于捕获,闭包可以与初始环境中的任何内容进行交互,而无需转发
void *,也无需依赖诸如继承之类的OO东西,这些东西会在应用程序的各个部分之间引入大量耦合。当然,如果你非常小心,闭包可以启动(或与之交互)线程...... -
@0x5453 是的,我会通过在另一个线程中执行回调来解决这个问题,但它仍然是指向函数的指针
-
我所知道的所有 GUI 库 do 在 GUI 线程上执行回调,其中大部分是同步的,但其中一些来自事件队列。如果你想在回调中做繁重的工作,你应该编写一个回调,将工作委托给另一个线程并快速返回。
标签: c++ user-interface pointers sfml