1

私は問題があります...多分カップル:)

私のチームは、プラットフォームに依存するものを処理するためにBoostとCMakeを使用してC++でクライアントを作成しました。チャームのように機能します!...時々:)とにかくWindowsのグラフィカルインターフェイスは実行されますが、MacOSXの場合は実行されません。これも私の課題です。当然私はCocoaを使用していますが、問題はメインループがC ++コードにあり、GUIがクライアントに応じていくつかのアニメーションを更新する必要があることです。

これはどのように行われますか?スレッドを釘付けにする方法と、C++コードからGUIコードに参照を渡す方法について非常に混乱しています。現在、GUIコードには、プロジェクトの他の部分から完全に分離された独自の小さなMVCがあります。私はたくさん見回しました、多分私は初心者が多すぎます:)、しかし私は本当に使うことができるものは何もうまくいきません...私はそれをすべて本当に理解していません。

NSApplicationを再作成するのに疲れました。私はこの役立つチュートリアルを見つけました:http: //cocoawithlove.com/2009/01/demystifying-nsapplication-by.html

デリゲートについて少し見てきました:デリゲート
はObjective-Cでどのように機能しますか?

NSNotificationCenterを少し見てきました:
Objective-CのNSNotificationCenterを介してイベントを送受信するクラスを作成するにはどうすればよいですか?


たぶん、ここの誰かが私を理解させる方法を知っていますか?何を調べますか?どこを見ればいいの?

4

1 に答える 1

3

あなたの質問はかなり一般的なので、Mac OS X に移植し、ネイティブの Cocoa UI を持ちたい主に C++ ベースのアプリケーションに対して、いくつかの高レベルのアーキテクチャのヒントしか提供できません。

スレッド: Windows で C++ コードにメイン スレッドがあるからといって、それが Mac OS X である必要があるという意味ではありません。NSApplication を使用して通常の Cocoa の方法でアプリケーションを起動し、アプリのデリゲートで次のapplicationDidFinishLaunching2 つのことを行う必要があります。

  1. NSThread が何もせずにすぐに戻る場合でも、NSThread を起動します。Cocoa を内部的にスレッド セーフに切り替えるには、これを行う必要があります (可能な限り)。C++ コードは代わりに pthread を起動するため、最初に少なくとも 1 つの上位レベルの NSThread を開始する必要があります。
  2. 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 つを使用することになります。

  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 コードを呼び出す前に、C++ オブジェクトを受け取り、Objective-C オブジェクトに変換する Objective-C++ ブリッジ関数を提供します。

  3. Objective-C++ ブリッジ オブジェクトを記述します。これらは、基になる Objective-C オブジェクトに薄い C++ ベニアを提供し、C++ レイヤーがそれと対話できるようにします。

明らかに、Objective-C コードから C++ を呼び出すには、逆に同様の手法を使用する必要があります。

于 2012-07-18T23:05:40.240 に答える