C# 碳素容器排气口和二次螺纹
想象一下,一个跨平台库必须创建自己的窗口,而不依赖WinForms/GTK#/WPF/MonoMac/etc(以防有人感兴趣) 这里有一个交易:支持Windows和X11的Unices支持(或可以使用)多个事件循环,每个线程一个。这意味着(a)您可以为每个线程创建一个窗口,并让它们独立工作;(b)您可以在一个线程上运行WinForms(或GTK#,WPF,…)窗口,并在另一个线程上打开OpenTK窗口,而不受干扰 现在,据我所知——诚然是有限的——碳并不支持这一点。操作系统事件仅传递到“主”事件循环,并且所有辅助线程都在烟雾上运行(即,ReceiveNextEvent始终返回eventLoopTimedOutErr,并且找不到任何事件)。OpenTK本身可以处理这一限制,没有问题,但对于尝试将OpenTK与不同的工具包(例如MonoMac)混合以显示配置窗口的应用程序来说,这是一个有趣的问题 两种选择:C# 碳素容器排气口和二次螺纹,c#,multithreading,macos-carbon,opentk,C#,Multithreading,Macos Carbon,Opentk,想象一下,一个跨平台库必须创建自己的窗口,而不依赖WinForms/GTK#/WPF/MonoMac/etc(以防有人感兴趣) 这里有一个交易:支持Windows和X11的Unices支持(或可以使用)多个事件循环,每个线程一个。这意味着(a)您可以为每个线程创建一个窗口,并让它们独立工作;(b)您可以在一个线程上运行WinForms(或GTK#,WPF,…)窗口,并在另一个线程上打开OpenTK窗口,而不受干扰 现在,据我所知——诚然是有限的——碳并不支持这一点。操作系统事件仅传递到“主”事件
- 放弃这个疯狂的想法,不允许将OpenTK与不同的工具包混合使用(糟糕)
- 拿起一把战斧,砍掉碳元素使其屈服(好)
(编程语言不重要,请使用您熟悉的任何东西。我更喜欢碳基解决方案,但Cocoa就可以了。)看一下和界面。您可能能够使用自定义逻辑拦截和转发消息。我在过去(非常遥远的过去)使用过这种技术,但是它已经很久了,我不记得所有伴随它的警告。我甚至不确定邮件过滤器是否会接收所有邮件。NET在将它们发送到
IMessageFilter
之前可能不会在幕后过滤它们,但值得一试。将事件从一个线程传递到另一个线程应该尽可能简单地传递事件。棘手的是,许多与UI相关的API都不是线程安全的,即使核心事件处理是安全的。任何涉及更新控件和绘图的操作都应该在主线程上处理。这将需要大量的来回工作,并且可能不值得尝试使其工作。不幸的是,此方法仅适用于基于WinForms的应用程序。我需要一种依靠原始碳(或可可)原料药的方法。然而,这给了我一个想法:碳不是提供了一种过滤(或预处理)消息的方法吗?如果是这样的话,我也许能找到一个解决办法。@小提琴手:我必须诚实。我对碳没有经验。抱歉:(是的,我也没有。这就是我在这里提问的原因。:)虽然这没有直接回答问题,但它确实指出了前进的方向:将所有与UI相关的命令排队,然后从主线程执行它们。