2010-01-13 23 views
5

在windows上,每个线程都有一个消息队列,每个消息队列将处理该线程拥有的窗口的消息。 这意味着编写一个应用程序非常简单,您可以在其中创建线程,使用消息循环和一个(或多个)窗口。忽略任何类型的应用程序问题,现在有一个应用程序窗口将继续与用户进行交互,即使其中某个窗口忙于某种模式操作。可可,Windows和线程?

现在,在将应用程序移植到可可时,我遇到了Interface Builder。对于希望更多地控制窗口创建和消息循环构建的人来说,这是一个惊喜。无论如何,我都能看到IB来自哪里。

然而,我的问题在于不透明的函数NSApplicationMain()。这在应用程序主线程中会自动创建应用程序主窗口,并运行消息泵,所有数据都从NIB文件很好地驱动。

但是,这给我留下了一个问题:即使我购买到Interface Builder是制作主应用程序窗口的方法 - 我已经计算出足够多的目标C来动态创建子窗口 - 以及如何创建线程 - 我可以看到如何在工作线程中创建消息泵。我开始怀疑它的可能性。

做可可的窗户甚至有那种线程亲和力吗?在Win32中?即每个线程对于该线程拥有的窗口都有自己的消息分派循环?我开始怀疑Cocoa可能期望我的所有窗口都被主线程“拥有”,并且我只能抵消其他线程的工作(和绘图)。

任何有关如何最佳地将多窗口每线程Win32应用程序转换为Cocoa范例的线索?

回答

9

Interface Builder在这个讨论中是一个红色的鲱鱼。真正的问题是中心,以可可的设计模式,并从你的问题这两段是关键:

然而,这给我留下了一个 问题:即使我买成的想法 界面生成器是办法 去让我的主应用程序窗口 - 和 我想通了足够的目标C 在飞行中创建子窗口 - 因为 以及如何创建线程 - 我 可以来看看如何在创建消息泵 工作者线程。我开始怀疑它可能的 。

做的可可窗口甚至有那种线程亲和力的种类 他们在Win32中? 即每个线程都有自己的消息 调度窗口所拥有的窗口 那个线程?我开始怀疑 ,也许Cocoa预计我所有的 窗口都是由主线程“拥有” 线程,我只是将工作 (和绘图)抵消到其他线程上。

总之,不,它不会这样工作。 Cocoa有一个完全不同的事件处理模型和一套完全不同的工具来支持并发。

值得注意的是,可可有主事件循环运行总是在主线程强烈的概念。这是用户事件处理的地方,几乎所有的绘图都发生在这里(尽管这个限制随着时间的推移已经放松)。

它是不同的,并试图弯曲它的工作像螺纹每窗口与泵是一个极端痛苦的道路。不要下去。

现在,可可确实每个线程都有运行循环。但它们不用于处理用户事件。

简而言之,您将需要重新审视应用程序的架构,以将代码提交给Cocoa。一个直的港口是不可能的。

+1

tl; dr版本:“Cocoa是像WPF一样的单线程UI工具包,可以在其他线程上工作” –

+1

可爱,但不正确。可可实际上有一堆对多线程的支持,包括多线程绘图。它没有做的是让多个线程独立处理事件(因为很大程度上,这是没有意义的)。 – bbum

+0

@bbum这就是我的意思,除非你强制它,Cocoa将有1个事件循环用于处理UI消息。我的tl;博士;版本不是很好解释,但我试图保持简短:) –