在执行后台任务时与Objective-C中的GUI交互

时间:2017-10-16 10:38:27

标签: java c++ user-interface cocoa

我创建了一个捆绑包,作为Cocoa应用程序的插件,我只能通过C / C ++ SDK与之交互。根据SDK,我的插件执行一个函数,通过引用设置结果数据对象并返回结果错误代码。

由于我团队的开发人员在Java方面经验丰富,我们使用管道在C / C ++和Java之间架起了一座桥梁。因此,当我调用SDK函数时,它会通过管道向Java发送一条消息,指示它执行Java方法。 Java方法将一个或多个回调消息发送到C / C ++ SDK,最终将设置结果数据对象并返回原始SDK函数的结果错误代码。

除非我的代码需要生成一个Java GUI(例如一个颜色选择器,其RGB值将通过C / C ++ SDK存储),否则这种机制非常有效。我希望我的Java GUI在纯Cocoa应用程序中展示类似于模式子窗口的行为。换句话说,当我与它交互时,我不希望主窗口的GUI阻塞(旋转沙滩球),同时将Java GUI保持在Cocoa GUI之上。

到目前为止,我尝试创建一个后台线程,将我的方法调用消息发送给Java。在Java方法生成GUI之前,我通过管道向C / C ++发送特殊消息。当C / C ++收到该消息时,我注册一个窗口观察者,然后使用Objective-C ++使用消息端口源(仍在后台线程)启动一个运行循环。

我的思维过程是因为我的管道读取是阻塞的,我不需要阅读任何其他内容,直到Java GUI被处理掉,我应该在我的后台线程中启动一个运行循环,希望能让我进行交互使用Cocoa GUI,从而引起我的观察者会识别的通知,并将Java GUI带回Cocoa GUI之前。当我处理Java GUI时,它将使用JNI向C / C ++发送远程消息端口请求并停止运行循环。

相反,在我处理Java GUI之前,主要的GUI块会发生什么,然后我执行上面描述的代码。我想这是因为我需要主线程等待结果,以便它可以将结果返回给C / C ++函数。我使用的机制是std :: async,它返回一个std :: future,我在其上调用get()。我认为我对get()的调用是我出错的地方,但我不确定如何等待我的后台线程完成。

如果它有帮助,我很乐意提供代码片段,但我想知道是否有人能够理解我所描述的内容并提供一些可以帮助我走上正确轨道的一般性建议。

1 个答案:

答案 0 :(得分:0)

我能够通过在Cocoa进程的主窗口顶部创建一个透明窗口并执行我的操作来解决阻塞问题,该操作告诉Java进程在后台线程中生成GUI。

[[NSApplication sharedApplication] runModalForWindow:transparentWindow]