gpt4 book ai didi

c# - Carbon ReceiveNextEvent 和辅助线程

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:48 25 4
gpt4 key购买 nike

想象一个跨平台库,它必须在不依赖 WinForms/GTK#/WPF/MonoMac/etc 的情况下创建自己的窗口(这是 OpenTK,以防有人感兴趣)。

这是一笔交易:Windows 和支持 X11 的 Unices 支持(或可以使用)多个事件循环,每个线程一个。这意味着 (a) 您可以为每个线程创建一个窗口并让它们独立工作,并且 (b) 您可以在一个线程上运行 WinForms(或 GTK#、WPF 等)窗口并在另一个线程上打开 OpenTK 窗口,不受干扰。

现在,据我所知——当然是有限的——知识,Carbon 不支持这一点。 OS 事件仅传递给“主”事件循环,所有辅助线程都在冒烟(也就是说,ReceiveNextEvent 总是返回 eventLoopTimedOutErr 并且找不到任何事件)。 OpenTK 本身可以解决这个限制,没问题,但这对尝试将 OpenTK 与不同工具包(例如 MonoMac)混合以显示配置窗口的应用程序提出了一个有趣的问题。

两种选择:

  • 放弃疯狂的想法,并禁止将 OpenTK 与不同的工具包混合使用(不好)。
  • 拿起一把战斧,砍下 Carbon 使其屈服(好)。

这是你进来的时候:你能想出任何方法来完成这项工作吗?想象一下以下场景:

  1. 线程 #1(主线程)运行我们自己选择的一些初始化代码并生成第二个线程(我们可以自由修改它)。
  2. 线程 #1(主线程)打开一个 native 窗口并运行 RAEL 循环 (RunApplicationEventLoop)。它超出了我们的直接控制,但如有必要,我们仍然可以安装计时器来运行我们的代码。
  3. 线程 #2(辅助)打开一个 OpenTK 窗口,该窗口立即挂起(事件仅传递给线程 #1,ReceiveNextEvent 什么也得不到)。

是否可以过滤来自线程 #1 的事件并根据需要将它们传递给线程 #2? CF 能以某种方式帮助这里吗? Mac OS X 高手,请帮忙!

(编程语言并不重要,使用您熟悉的任何语言。我更喜欢基于 Carbon 的解决方案,但 Cocoa 也可以。)

最佳答案

将事件从一个线程传递到另一个线程应该可以正常地传递事件。棘手的部分是许多与 UI 相关的 API 不是线程安全的,即使核心 Carbon 事件处理是线程安全的。任何涉及更新控件和绘图的事情都应该在主线程上处理。这将需要大量的来回,而且可能不值得尝试让它发挥作用。

关于c# - Carbon ReceiveNextEvent 和辅助线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4088788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com