【问题标题】:Is there a way to write a GUI without an event loop?有没有办法在没有事件循环的情况下编写 GUI?
【发布时间】:2016-08-17 21:15:04
【问题描述】:

像 Qt 这样的库提供了一个处理 UI 事件的事件循环,通常(或总是?)包装 OS UI 事件循环以获得最佳结果。

现在我不禁想知道是否有一种方法可以在没有主事件循环的情况下编写 UI,这样它就可以在所有主要操作系统上运行。

如果可能,它将如何工作,是否有任何关于无事件循环 UI(最好是 C++)的示例?

【问题讨论】:

  • 可能不会。对不起。
  • 如果您不与操作系统的事件系统/队列交互,您(作为用户空间程序)将如何接收事件?
  • 是的,但是您必须使用尚未发明的技术从头开始编写一个新的操作系统来响应用户交互。

标签: c++ user-interface event-handling cross-platform


【解决方案1】:

Windows 和 X11 (Linux) 都要求任何窗口都可以响应事件回调(或者是当前响应事件回调的窗口的父级),否则操作系统会将它们视为停止响应 - 在 Windows 上至少,会触发“程序 X 已停止响应”弹出窗口。

如何处理这些事件回调的语义是不同的(即,Windows 需要“创建窗口的线程”来处理它们,而 Linux 需要“主线程”来处理他们),但原理是一样的。

我对 MacOS 不熟悉,但我想它有类似的逻辑。

【讨论】:

  • linuxwindows 的概念吗?这对我来说是新的。能详细点吗?
  • @πάνταῥεῖ 嗯,更新了。从字面上看,我使用过的每个版本的 Linux 都有某种形式的 GUI,所以我习惯于将它们统称为“Linux”。
  • X11 确实有窗口的概念,X 有一个事件循环。我认为这就是所指的。但是您绝对正确,这不是 Linux 的东西 - 它是 X 的东西。
【解决方案2】:

我知道的所有主要窗口框架都期望通过 gui 应用程序与事件循环进行交互。

现在,您可以封装 ui 框架交互并将所述事件传送到事件广播器。

然后应用程序将只是订阅通知。

现在,在某些情况下,窗口框架可能要求消息的同步响应,因此在这些情况下,抽象会泄漏一点。但否则你可以在客户端代码中有一个无事件循环的 GUI 应用程序(事件循环仍然存在,但仅在跨平台库中)。

想象在这样的框架中进行编程的一种方式是,您将设置 ui 小部件并将它们与代码挂钩,包括像“在应用程序启动时”这样的挂钩,它可能会启动您的主窗口,进而挂钩更多消息。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 2019-01-18
    • 2020-12-20
    • 2011-06-04
    • 2020-04-07
    • 2018-07-29
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多