1

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

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

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

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

我看了一点 Delegates:委托
如何在 Objective-C 中工作?

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


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

4

1 回答 1

3

您的问题相当笼统,因此我只能为您希望移植到 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 写了很多关于如何做到这一点的文章,我建议阅读他最近的博客文章以及他早期关于该主题的一些文章。

为了更概括地阐述,您将使用从 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++。

于 2012-07-18T23:05:40.240 回答