2017-10-16 53 views
0

我创建了一个包,作为Cocoa应用程序的插件,我只能通过C/C++ SDK进行连接。根据SDK,我的插件执行一个函数,通过引用来设置结果数据对象并返回结果错误代码。在执行后台任务时与Objective-C中的GUI进行交互

由于我的团队中的开发人员在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++发送远程消息端口请求并停止运行循环。

取而代之的是主要的GUI块,直到我处理Java GUI,然后执行上面描述的代码。我想这是因为我需要主线程来等待结果,以便它可以将结果返回给C/C++函数。我使用的机制是一个std :: async,它返回一个std :: future,我在其上调用get()。我收集到我对get()的调用是出错的地方,但我不知道如何等待我的后台线程完成。

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

回答

0

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

[[NSApplication sharedApplication] runModalForWindow:transparentWindow]