Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从C+启动Cocoa GUI+;循环并传递引用_Objective C_Multithreading_Cocoa_User Interface_Nsapplication - Fatal编程技术网

Objective c 从C+启动Cocoa GUI+;循环并传递引用

Objective c 从C+启动Cocoa GUI+;循环并传递引用,objective-c,multithreading,cocoa,user-interface,nsapplication,Objective C,Multithreading,Cocoa,User Interface,Nsapplication,我有个问题。。。也许是一对:) 我的团队用C++和Boost和CMake编写了一个客户端来处理平台相关的东西。工作就像一个魅力。。。有时:)无论如何,Windows的图形界面已经完成了,但Mac OS X没有。这也是我的任务。当然我使用的是可可,但问题是主循环在C++代码中,GUI也应该根据客户端更新一些动画。 这是怎么做到的? 我很困惑如何钉线程和如何通过引用从C++代码到GUI代码。现在,GUI代码有自己的小MVC,与项目的其余部分完全分离。 我环顾了很多地方,也许我是一个太多的noob:)

我有个问题。。。也许是一对:)

<>我的团队用C++和Boost和CMake编写了一个客户端来处理平台相关的东西。工作就像一个魅力。。。有时:)无论如何,Windows的图形界面已经完成了,但Mac OS X没有。这也是我的任务。当然我使用的是可可,但问题是主循环在C++代码中,GUI也应该根据客户端更新一些动画。 这是怎么做到的? 我很困惑如何钉线程和如何通过引用从C++代码到GUI代码。现在,GUI代码有自己的小MVC,与项目的其余部分完全分离。 我环顾了很多地方,也许我是一个太多的noob:),但我不罚款任何我可以真正使用。。。我真的不完全明白

我已经厌倦了重新创建非应用程序。我发现这本教程很有用:

我已经看了一些代表:

我在NSNotificationCenter上看了一下:



也许这里有人知道如何让我明白?调查什么?我应该看什么?

< p>您的问题相当普遍,所以我只能给出一些高级的架构技巧,作为一个主要基于C++的应用程序,您想将其移植到Mac OS X上,并有一个本地可可UI。

<强>线程:因为C++代码在Windows上有主线程并不意味着它需要在Mac OS X上。启动应用程序通常采用NSpice的COCOA方式,然后在应用程序委托的代码>应用程序中完成< /Cord> >你应该做两件事:

  • 启动NSThread,即使它什么也不做,只是立即返回。您需要这样做,才能将Cocoa切换为内部线程安全的(比如它可以)。因为您的C++代码将启动pTrx,所以您需要首先启动至少一个更高级别的NStWord.< 调用C++代码的启动例程。如果此代码长时间运行,请启动一个单独的线程。没有理由,你的C++代码需要在Mac OS X上的主线程上运行;它可以在任何辅助螺纹上。MacOSX上主线程的唯一特殊之处是事件在那里传递,UI更改应该在那里发生。这两件事都应该用可可本地代码来处理,而不是用便携式C++代码来处理。 语言障碍你需要应对语言障碍。你的C++代码不能直接访问ObjtoC对象,反之亦然。您可以使用Objective-C++来解决这个问题,但最佳实践是仅将Objective-C++用于较薄的翻译层,并将两者分开。除了提供更规范的编程环境外,它还可以从逻辑上帮助将UI代码(Objective-C)与较低级别的应用程序服务(C++)分离。Rob Napier已经写了很多关于如何做到这一点的文章,我建议阅读他之前关于这个主题的一些文章

    <>请更详细地说明一下,您将使用几种技术中的一种从C++到Objto-C,因为这是您所问的方向:

    提供了可以从Objtovi-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
    
  • > p>提供对象C++ C++桥函数,这些函数在调用本机Objto-C代码之前将C++对象转换为ObjtoE-C对象。

  • 编写Objective-C++桥对象。这些提供了一个薄的C++贴面,以底层的ObjuleC对象,因此C++层可以与它交互。
    显然,在反向调用中,你需要使用类似的技术从Objto-C代码调用C++。< /P> + 1的细节,尽管C++和目标C I将不引入C接口,除非需要另一个使用。谢谢。我进行了编辑,以解释为什么您可能选择使用C接口函数。(它是唯一一种从ObjuleC和C++中调用的简单实用函数的方法。)