2017-10-16 52 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]