Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 碳素容器排气口和二次螺纹_C#_Multithreading_Macos Carbon_Opentk - Fatal编程技术网

C# 碳素容器排气口和二次螺纹

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窗口,而不受干扰 现在,据我所知——诚然是有限的——碳并不支持这一点。操作系统事件仅传递到“主”事件

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

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

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

两种选择:

  • 放弃这个疯狂的想法,不允许将OpenTK与不同的工具包混合使用(糟糕)
  • 拿起一把战斧,砍掉碳元素使其屈服(好)
这就是你进来的原因:你能想出什么办法让这一切顺利进行吗?想象一下以下场景:

  • 线程#1(main)运行我们自己选择的一些初始化代码,并生成第二个线程(我们可以自由修改)
  • 线程#1(main)打开本机窗口并运行RAEL循环(RunApplicationEventLoop)。它超出了我们的直接控制,尽管我们仍然可以安装计时器来运行我们的代码,如果必要的话
  • 线程#2(次要)打开一个OpenTK窗口,该窗口立即挂起(事件只传递给线程#1,而ReceiveNextEvent什么也得不到)
  • 是否可以根据需要从线程1筛选事件并将其传递到线程2?我能帮上忙吗?Mac OS X的大师们,请帮忙


    (编程语言不重要,请使用您熟悉的任何东西。我更喜欢碳基解决方案,但Cocoa就可以了。)

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

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

    不幸的是,此方法仅适用于基于WinForms的应用程序。我需要一种依靠原始碳(或可可)原料药的方法。然而,这给了我一个想法:碳不是提供了一种过滤(或预处理)消息的方法吗?如果是这样的话,我也许能找到一个解决办法。@小提琴手:我必须诚实。我对碳没有经验。抱歉:(是的,我也没有。这就是我在这里提问的原因。:)虽然这没有直接回答问题,但它确实指出了前进的方向:将所有与UI相关的命令排队,然后从主线程执行它们。