代码之家  ›  专栏  ›  技术社区  ›  The Fiddler

碳接收排气管和二次螺纹

  •  2
  • The Fiddler  · 技术社区  · 15 年前

    假设一个跨平台库必须创建自己的窗口而不依赖winforms/gtk/wpf/monomac/etc(这是 OpenTK 以防有人感兴趣)。

    这里有一个协议:支持Windows和x11的Unices支持(或可以使用)多个事件循环,每个线程一个。这意味着(a)您可以为每个线程创建一个窗口,让它们独立工作;(b)您可以在一个线程上运行一个winforms(或gtk,wpf,…)窗口,并在另一个线程上打开一个opentk窗口,而不会受到干扰。

    现在,据我所知,碳并不支持这一点。操作系统事件只传递到“主”事件循环,所有辅助线程都在冒烟中运行(即,ReceiveNextEvent始终返回EventLoopTimedOuterr,并且没有发现任何事件)。opentk本身可以处理这个限制,没有问题,但是对于那些试图将opentk与不同的工具包(例如monomac)混合以呈现配置窗口的应用程序来说,这是一个有趣的问题。

    两种选择:

    • 放弃疯狂的想法,不允许将OpenTK与不同的工具包(坏)混合在一起。
    • 挑一把战斧,把碳砍下来投降(很好)。

    这是你进来的地方:你能想出什么办法使这个工作成功吗?想象一下下面的场景:

    1. 线程1(main)运行一些我们自己选择的初始化代码,并生成第二个线程(我们可以自由修改)。
    2. 线程1(主)打开本机窗口并运行rael循环(runapplicationEventLoop)。它超出了我们的直接控制,尽管我们仍然可以安装定时器来运行我们的代码,如果必要的话。
    3. 线程2(二级)打开一个OpenTk窗口,该窗口立即挂起(事件只传递到线程1,ReceiveNextEvent什么也得不到)。

    是否可以过滤线程1中的事件,并在必要时将其传递到线程2?CF能帮上忙吗?Mac OS X的权威,请帮忙!

    (编程语言无关紧要,使用您熟悉的任何东西。我更喜欢碳基溶液,但可可可以很好地发挥作用。)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Uncommon    14 年前

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

        2
  •  0
  •   Brian Gideon    15 年前

    看一看 Application.AddMessageFilter 以及 IMessageFilter 接口。你 可以 能够使用自定义逻辑截取和转发消息。我以前使用过这种方法(非常遥远的过去),但它已经很久以前了,我不记得所有与之相关的警告。我甚至不确定消息过滤器是否会接收所有消息。.NET在将它们发送到 IMessageFilter 但值得一试。