代码之家  ›  专栏  ›  技术社区  ›  Chris Becke

可可,窗户和线?

  •  5
  • Chris Becke  · 技术社区  · 15 年前

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

    现在,在将应用程序移植到Cocoa时,我遇到了界面构建器。对于那些希望更多地控制窗口创建和消息循环结构的人来说,这是一个惊喜。我还是能看到ib是从哪里来的。

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

    然而,这给我留下了一个问题:即使我认同这样一个观点,即界面构建器是制作我的主应用程序窗口的方法——而且我已经找到了足够的目标C来动态创建子窗口——以及如何创建线程——我也能看到如何在工作线程中创建消息泵。我开始怀疑它的可能性。

    Cocoa中的窗口是否甚至有类似于win32中的线程关联?也就是说,每个线程都有自己的消息调度循环,用于该线程所拥有的窗口?我开始怀疑Cocoa可能希望我的所有窗口都被主线程“拥有”,而我只是将工作(和绘图)偏移到其他线程上。

    关于如何最好地将每个线程的多窗口win32应用程序转换为cocoa的范例,有什么线索吗?

    1 回复  |  直到 15 年前
        1
  •  9
  •   bbum    15 年前

    在本讨论中,接口生成器是一个障碍。真正的问题是以Cocoa的设计模式为中心,问题中的这两段是关键:

    然而,这让我 问题:即使我认同这个想法 接口生成器是 去制作我的主应用程序窗口-和 我已经找到了足够的目标c 动态创建子窗口 以及如何创建线程-i 看不到如何创建消息泵 在工作线程中。我开始怀疑 这是可能的。

    可可的窗户也有这种吗 它们在Win32中的线程关联? 即每个线程都有自己的消息 Windows的调度循环 那根线?我开始怀疑 也许可可期待着我 主窗口“拥有” 线程和我只是得到抵消工作 (和拉伸)到其他螺纹上。

    简言之,不是这样的。Cocoa有一个完全不同的事件处理模型和一套完全不同的支持并发性的工具。

    值得注意的是,可可对 主事件循环 运行 总是 在主线程上。这是处理用户事件和几乎所有绘图的地方(尽管随着时间的推移,此限制已被放宽)。

    它是不同的,试图弯曲它像每个窗口的线程与泵是一个极端痛苦的路径。别往下走。

    可可 每个线程运行循环。但它们不用于处理用户事件。

    简而言之,您需要重新访问应用程序的体系结构,以便将代码转移到Cocoa。一个直的端口是不可能的。