在Windows上,每个线程都有一个消息队列,每个消息队列将处理该线程拥有的窗口的消息。 这意味着编写一个应用程序非常简单,您可以使用消息循环和一个(或多个)窗口创建一个线程。忽略任何类型的应用程序问题,现在有一个应用程序窗口将继续与用户交互,即使其他窗口之一忙于某种模式操作。
现在,在将应用程序移植到cocoa时,我遇到了Interface Builder。对于希望更多地控制窗口创建和消息循环构造的人来说,这是一个惊喜。然而,我可以看到IB来自哪里。
然而,我的问题在于不透明的功能NSApplicationMain()。这 - 在应用程序主线程上,自动创建应用程序主窗口,并运行消息泵,所有数据都可以从NIB文件中很好地驱动。
然而,这给我留下了一个问题:即使我认为Interface Builder是制作我的主应用程序窗口的方法 - 我已经想出足够的目标C来动态创建子窗口 - 以及如何创建线程 - 我可以看到如何在工作线程中创建消息泵。我开始怀疑它的可能性。
在可可中的Windows是否具有他们在Win32中所做的那种线程关联?即每个线程都有自己的消息调度循环用于该线程拥有的窗口?我开始怀疑Cocoa可能希望我的所有窗口都被主线“拥有”,我只是将工作(和绘图)偏移到其他线程上。
有关如何最好地将每个线程的多窗口Win32应用程序转换为Cocoa的范例的任何线索?
答案 0 :(得分:9)
Interface Builder在本次讨论中是一个红色的鲱鱼。真正的问题是以Cocoa的设计模式为中心,你问题中的这两段是关键:
然而,这让我有了一个 问题:即使我接受了这个想法 Interface Builder是通往的方式 去制作我的主应用程序窗口 - 和 我已经找到了足够的客观C 动态创建子窗口 - 如 以及如何创建线程 - 我 可以看到如何创建消息泵 在工人线程中。我开始怀疑 它可能。
可可的窗户甚至都有 他们在Win32中做的线程亲和力? 即每个线程都有自己的消息 Windows拥有的调度循环 那个帖子?我开始怀疑 或许Cocoa期待我的全部 窗户由主要“拥有” 线程,我只是抵消工作 (和绘图)到其他线程上。
简而言之,不,它不会那样运作。 Cocoa有一个完全不同的事件处理模型和一组完全不同的工具来支持并发。
值得注意的是,Cocoa强烈认为主事件循环在主线程上运行始终。这是处理用户事件和几乎所有绘图发生的地方(尽管随着时间的推移已经放松了这个限制)。
它是不同的,并试图弯曲它的工作就像每个窗口带螺纹的泵是一条极度痛苦的道路。不要贬低它。
现在,Cocoa 每个线程都有运行循环。但它们并不用于处理用户事件。
简而言之,您将需要重新访问应用程序的体系结构,以将代码提取到Cocoa。直接端口是不可能的。