Запустите Cocoa GUI из цикла C ++, а также передавая ссылки - PullRequest
1 голос
/ 01 ноября 2011

У меня проблема ... может быть, пара :)

Моя команда написала клиент на C ++, используя Boost и CMake, чтобы позаботиться о зависимости от платформы.Работает как шарм!... иногда :) В любом случае графический интерфейс для Windows сделан, но для Mac OS X - нет.Что также является моим назначением.Естественно, я использую Какао, но проблема в том, что основной цикл находится в коде C ++, а также графический интерфейс должен обновлять несколько анимаций в зависимости от клиента.

Как это сделать?Я очень озадачен тем, как прибить потоки и как передавать ссылки из кода C ++ в код GUI.Прямо сейчас код GUI имеет свой собственный маленький MVC, полностью отделенный от остальной части проекта.Я много осмотрелся, может быть, я слишком много нубов :), но я ничего не понимаю, что могу реально использовать ... Я не совсем понимаю все это.

Мне надоело воссоздавать NSApplication.Я нашел этот полезный учебник: http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html

Я немного посмотрел на делегатов:
Как делегат работает в target-C?

У меня естьнемного посмотрел на NSNotificationCenter:
Как создать класс для отправки и получения событий через NSNotificationCenter в Objective-C?


Может быть, кто-то здесь знает, как заставить меня понять?Что посмотреть?Куда мне смотреть?

1 Ответ

3 голосов
/ 19 июля 2012

Ваш вопрос носит довольно общий характер, поэтому я могу дать лишь несколько советов по высокоуровневой архитектуре для преимущественно приложений на C ++, которые вы хотите портировать на Mac OS X и иметь собственный пользовательский интерфейс Cocoa.

Потоки: Тот факт, что код C ++ имеет основной поток в Windows, не означает, что он должен быть в Mac OS X. Запустите ваше приложение обычным способом Cocoa с NSApplication, а затем в applicationDidFinishLaunching вашего делегата приложения, вы должны сделать двавещи:

  1. Запустите NSThread, даже если он ничего не делает и просто сразу возвращается.Вы должны сделать это, чтобы переключить Какао, чтобы быть внутренним потокобезопасным (таким, как это может быть).Поскольку ваш код C ++ вместо этого будет запускать pthreads, вам нужно сначала запустить хотя бы один NSThread более высокого уровня.
  2. Вызовите процедуры запуска вашего кода C ++.Если этот код долго выполняется, запустите отдельный поток.Нет никаких причин, по которым ваш код C ++ должен выполняться в главном потоке в Mac OS X;это может быть на любой вспомогательной нити.Единственная особенность основного потока в Mac OS X состоит в том, что туда доставляются события и оттуда должны происходить изменения пользовательского интерфейса.Обе эти вещи должны обрабатываться в собственном коде Какао, а не в переносимом коде C ++.

Языковой барьер У вас есть языковой барьер, с которым нужно иметь дело.Ваш код C ++ не может напрямую обращаться к объектам Objective-C и наоборот.Вы можете сгладить эту проблему с помощью Objective-C ++, но лучше всего использовать Objective-C ++ только для тонкого слоя перевода и держать их отдельно.Помимо обеспечения более канонической среды программирования, она также помогает логически отделить код пользовательского интерфейса (в Objective-C) от сервисов приложений более низкого уровня (в C ++).Роб Нейпир много писал о том, как это сделать, и я предлагаю прочитать его недавнее сообщение в блоге вместе с некоторыми из его более ранних публикаций на эту тему.

Для более общей разработки вы будетеиспользовать одну из нескольких техник для перехода с C ++ на Objective-C, поскольку это направление, о котором вы спрашивали:

  1. Предоставьте интерфейсные функции C, которые можно вызывать из Objective-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 ++.Они обеспечивают тонкий облик C ++ для базового объекта Objective-C, так что слой C ++ может взаимодействовать с ним.

Очевидно, что вам придется использовать аналогичные методы в обратном порядке для вызова из Objective-Код C на C ++.

...