【问题标题】:Fire up Cocoa GUI from C++ loop and also passing references从 C++ 循环启动 Cocoa GUI 并传递引用
【发布时间】:2011-12-19 12:07:55
【问题描述】:

我有一个问题......也许有几个:)

我的团队使用 Boost 和 CMake 用 C++ 编写了一个客户端来处理与平台相关的内容。奇迹般有效! ...有时:) 无论如何,Windows 的图形界面已经完成,但对于 Mac OS X 却没有。这也是我的任务。当然,我使用的是 Cocoa,但问题是主循环在 C++ 代码中,而且 GUI 应该根据客户端更新一些动画。

这是怎么做到的? 我对如何确定线程以及如何将引用从 C++ 代码传递到 GUI 代码感到非常困惑。现在,GUI 代码有自己的小 MVC,与项目的其余部分完全分离。 我环顾四周,也许我太菜鸟了 :),但我对我真正可以使用的任何东西都做不好......我并不完全了解这一切。

我已经厌倦了重新创建 NSApplication。我发现这个有用的教程: http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html

我看了一点代表:
How does a delegate work in objective-C?

我看了一点 NSNotificationCenter:
How to create a class to send and receive events through NSNotificationCenter in Objective-C?


也许这里有人知道如何让我理解?要看什么?我应该看哪里?

【问题讨论】:

    标签: objective-c multithreading cocoa user-interface nsapplication


    【解决方案1】:

    您的问题相当笼统,因此我只能为您希望移植到 Mac OS X 并拥有原生 Cocoa UI 的主要基于 C++ 的应用程序提供一些高级架构提示。

    线程: 仅仅因为 C++ 代码在 Windows 上具有主线程并不意味着它必须在 Mac OS X 上。使用 NSApplication 以通常的 Cocoa 方式启动您的应用程序,然后在您的应用程序中代表的applicationDidFinishLaunching你应该做两件事:

    1. 启动一个 NSThread,即使它什么都不做并且立即返回。您需要这样做以将 Cocoa 切换为内部线程安全(例如可以)。由于您的 C++ 代码将改为启动 pthread,因此您需要先启动至少一个更高级别的 NSThread。
    2. 调用 C++ 代码的启动例程。如果此代码长时间运行,请启动一个单独的线程。没有理由让您的 C++ 代码需要在 Mac OS X 的主线程上运行;它可以在任何辅助线程上。 Mac OS X 上的主线程唯一的特别之处是事件在那里传递,UI 更改应该从那里发生。这两件事都应该在 Cocoa 原生代码中处理,而不是在可移植的 C++ 代码中。

    语言障碍 你有语言障碍需要处理。您的 C++ 代码不能直接访问 Objective-C 对象,反之亦然。您可以使用 Objective-C++ 解决这个问题,但最佳实践是仅将 Objective-C++ 用于薄翻译层并将两者分开。除了提供更规范的编程环境之外,它还有助于在逻辑上将 UI 代码(在 Objective-C 中)与较低级别的应用程序服务(在 C++ 中)分开。 Rob Napier 写了很多关于如何做到这一点的文章,我建议阅读 his recent blog post 以及他之前关于该主题的一些帖子。

    更概括地说,您将使用从 C++ 到 Objective-C 的几种技术之一,因为这是您询问的方向:

    1. 提供可从 Objective-C 或 C++ 调用的 C 接口函数。它们的实现可以用任何最方便的语言编写。这些函数的标头将包含如下行,以让 C++ 代码知道它们具有 C 而不是 C++ 接口:

      #if defined __cplusplus
      extern "C" {
      #endif
      void passAString(const char *string);
      // ... some other C interface functions
      #if defined __cplusplus
      }
      #endif
      
    2. 提供 Objective-C++ 桥接函数,在调用原生 Objective-C 代码之前将 C++ 对象转换为 Objective-C 对象。

    3. 编写 Objective-C++ 桥对象。它们为底层的 Objective-C 对象提供了一层薄薄的 C++ 单板,因此 C++ 层可以与之交互。

    显然,您需要反过来使用类似的技术从 Objective-C 代码调用 C++。

    【讨论】:

    • +1 详细说明,尽管作为 C++ 和 Objective C,除非需要其他用途,否则我根本不会引入 C 接口。
    • 谢谢。我编辑解释了为什么您可能会选择使用 C 接口函数。 (这是拥有一个可从 Objective-C 和 C++ 调用的简单实用函数的唯一方法。)
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多