Multithreading UI可以从辅助线程运行吗?

Multithreading UI可以从辅助线程运行吗?,multithreading,cocoa,Multithreading,Cocoa,我正在开发一个程序,它将独占主线程以实现其自身的目的。有条件地,此程序可能需要生成Cocoa窗口。但是,由于主线程不会运行事件循环(或者至少不会运行nsrunlop),我想知道是否能够从辅助线程运行带有nsrunlop的UI 我知道在Windows上也可以实现类似的功能,但文档中不清楚这是否适用于Mac OS,也不清楚如果可能的话如何实现 首先,主线程必须调用NSApplicationMain。否。UI需要位于主线程上。您可以使用NSOperation或其他方式在后台执行操作,并更新UI以执行p

我正在开发一个程序,它将独占主线程以实现其自身的目的。有条件地,此程序可能需要生成Cocoa窗口。但是,由于主线程不会运行事件循环(或者至少不会运行
nsrunlop
),我想知道是否能够从辅助线程运行带有
nsrunlop
的UI

我知道在Windows上也可以实现类似的功能,但文档中不清楚这是否适用于Mac OS,也不清楚如果可能的话如何实现


首先,主线程必须调用
NSApplicationMain

否。UI需要位于主线程上。您可以使用NSOperation或其他方式在后台执行操作,并更新UI以执行performSelectorOnMainThread
UI itsel依赖于应用程序运行循环

在次线程上运行GUI,在主线程上执行工作,与其他方式相比,有什么好处?当您觉得必须在基本应用程序设计原则上进行操作时(在任何平台上)这强烈表明你的整个设计有缺陷,你需要回到绘图板上。@Jay,请解释一下为什么GUI基本上应该从主线程运行。这在Windows上是绝对可行的,完全合法。有了WPF和多个应用程序域,你甚至可以通过多个线程来完成这项工作。在Java中,Swing有自己的线程,与主线程不同。如果这里有任何基本缺陷,那就是Cocoa总是查找第一个线程,而不是调用了
NSApplicationMain
或创建了第一个运行循环的线程。@PeterHosey,只有在加载了特定库的情况下,程序才会有GUI,因为程序会解释来自其他源的代码,我不能让控制权倒置。我的解决方案是在辅助线程上运行GUI,并使用
performSelector:onThread:
消息族在解释代码和GUI之间进行同步。如果UI线程可以封装在可能需要它的库中,并让我的其余代码独立于线程,那就更好了。相反,我可能不得不生成自己的线程,让主线程睡眠,除非需要。你不能将它们分成两个程序,一个启动另一个,两个都使用某种IPC机制进行通信?我知道它依赖于应用程序运行循环,但我不明白为什么这会成为一个问题。您可以在任何线程上创建一个
nsrunlop
。@zneak:在我看来,Apple事件被传递到主线程的运行循环。从(例如)Finder打开应用程序中的文档,通过Dock激活应用程序,以及当用户在应用程序已打开时启动应用程序时“重新打开”应用程序都是Apple事件,它们将在主线程上交付,因此AppKit的标准处理程序也必须在主线程上注册。