2

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

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

现在,据我所知——公认的有限——知识,Carbon 不支持这一点。操作系统事件仅传递到“主”事件循环,所有辅助线程都在烟雾上运行(即 ReceiveNextEvent 始终返回 eventLoopTimedOutErr 并且没有找到任何事件)。OpenTK 本身可以处理这个限制,没问题,但是这对尝试将 OpenTK 与不同的工具包(例如 MonoMac)混合以呈现配置窗口的应用程序提出了一个有趣的问题。

两种选择:

  • 放弃这个疯狂的想法,并不允许将 OpenTK 与不同的工具包混合(不好)。
  • 选择一把战斧并砍下碳投降(好)。

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

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

是否可以从线程#1 过滤事件并根据需要将它们传递给线程#2?CF可以在这里提供帮助吗?Mac OS X 的高手,请帮助!

(编程语言无关紧要,使用任何你熟悉的东西。我更喜欢基于 Carbon 的解决方案,但 Cocoa 可以正常工作。)

4

2 回答 2

1

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

于 2011-10-31T20:29:09.940 回答
0

看看Application.AddMessageFilterIMessageFilter接口。您可能能够使用自定义逻辑拦截和转发消息。我在过去(非常遥远的过去)使用过这种技术,但它已经很久以前,我不记得所有伴随它的警告。我什至不确定消息过滤器是否会收到所有消息。.NET 在将它们发送到 .NET 之前可能不会在幕后过滤掉它们IMessageFilter,但值得一试。

于 2010-11-03T18:57:56.043 回答