あなたの質問はかなり一般的なので、Mac OS X に移植し、ネイティブの Cocoa UI を持ちたい主に C++ ベースのアプリケーションに対して、いくつかの高レベルのアーキテクチャのヒントしか提供できません。
スレッド: Windows で C++ コードにメイン スレッドがあるからといって、それが Mac OS X である必要があるという意味ではありません。NSApplication を使用して通常の Cocoa の方法でアプリケーションを起動し、アプリのデリゲートで次のapplicationDidFinishLaunching
2 つのことを行う必要があります。
- NSThread が何もせずにすぐに戻る場合でも、NSThread を起動します。Cocoa を内部的にスレッド セーフに切り替えるには、これを行う必要があります (可能な限り)。C++ コードは代わりに pthread を起動するため、最初に少なくとも 1 つの上位レベルの NSThread を開始する必要があります。
- C++ コードのスタートアップ ルーチンを呼び出します。このコードが長時間実行される場合は、別のスレッドを起動してください。C++ コードを Mac OS X のメイン スレッドで実行する必要がある理由はありません。任意の補助スレッドにある可能性があります。Mac OS X のメイン スレッドに関する唯一の特別な点は、イベントがそこで配信され、そこから UI の変更が行われることです。これらは両方とも、移植可能な C++ コードではなく、Cocoa ネイティブ コードで処理する必要があります。
言語の壁対処しなければならない言語の壁があります。C++ コードは、Objective-C オブジェクトに直接アクセスできず、その逆も同様です。この問題は Objective-C++ でスムーズに処理できますが、ベスト プラクティスは、Objective-C++ を薄い翻訳レイヤにのみ使用し、2 つを分離しておくことです。より標準的なプログラミング環境を提供するだけでなく、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
ネイティブの Objective-C コードを呼び出す前に、C++ オブジェクトを受け取り、Objective-C オブジェクトに変換する Objective-C++ ブリッジ関数を提供します。
Objective-C++ ブリッジ オブジェクトを記述します。これらは、基になる Objective-C オブジェクトに薄い C++ ベニアを提供し、C++ レイヤーがそれと対話できるようにします。
明らかに、Objective-C コードから C++ を呼び出すには、逆に同様の手法を使用する必要があります。