可可,Windows和线程?

Chr*_*cke 5 windows cocoa multithreading

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

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

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

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

在可可中的窗口是否具有它们在Win32中所做的那种线程关联?即每个线程有自己的消息调度循环为该线程拥有的窗口?我开始怀疑也许Cocoa期望我的所有窗口都被主线"拥有",我只是将工作(和绘图)偏移到其他线程上.

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

bbu*_*bum 9

Interface Builder在本次讨论中是一个红色的鲱鱼.真正的问题是以Cocoa的设计模式为中心,你问题中的这两段是关键:

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

在可可中的窗口是否具有它们在Win32中所做的那种线程关联?即每个线程有自己的消息调度循环为该线程拥有的窗口?我开始怀疑也许Cocoa期望我的所有窗口都被主线"拥有",我只是将工作(和绘图)偏移到其他线程上.

简而言之,不,它不会那样工作.Cocoa有一个完全不同的事件处理模型和一组完全不同的工具来支持并发.

值得注意的是,Cocoa有一个主要事件循环的强大概念,它始终在主线程上运行.这是处理用户事件的地方,几乎所有绘图都在这里发生(虽然随着时间的推移这个限制已经放松).

它是不同的,并试图弯曲它的工作像每个窗口的带螺纹泵是一个极端痛苦的道路.不要贬低它.

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

简而言之,您将需要重新访问应用程序的体系结构,以将代码提取到Cocoa.直接端口是不可能的.

  • tl;dr 版本:“Cocoa 是一个像 WPF 一样的单线程 UI 工具包,可以在其他线程上工作” (2认同)