簡體   English   中英

IPC with gui(Java和Native code)

[英]IPC with gui (Java & Native code)

我的申請由兩部分組成 -

Java中的一些GUI邏輯。 本機代碼(主要是Delphi) - GUI實現本身。

Java使用本機代碼進行簡單的操作,例如打開窗口和響應用戶輸入事件 - 實現是通過JNI完成的。

我有興趣將雙方分成不同的流程 - 在不掛gui的情況下,在它們之間實施IPC的最佳方法是什么? 我傾向於TCP套接字或共享內存,但在我深入研究之前,我很樂意聽到一些意見。 性能和簡單的實現是我主要關注的問題。

提前致謝。

如果您的問題是關於內存消耗

如果你的RAM不足(正如你的評論所暗示的那樣 - 但你應該在你的主要問題中寫得更好:你提供的細節越多,得到的答案就越好)。

你為什么要混用Java和Delphi? Java可能不適合處理超過1 GB的內存,因為它對於常見任務和內部GC具有更高的內存消耗。 即使你以64位運行JVM,你也會遇到新的擴展問題:你應該編寫非常具體的代碼來處理Java的大量內存。

公平地說,問題不是來自Delphi,而是來自Java內存消耗。 因此,恕我直言,你應該更好地用本機代碼編碼你的數據層。 Java可能會增加您的問題。

你可以:

  • 使用Free Pascal編譯器從Delphi代碼編譯64位庫,然后從主32位Delphi應用程序或使用JNI從Java使用Memory Mapped文件作為橋來調用它。
  • 更改訪問數據的方式。 您可能不需要同時擁有所有這些GigaBytes數據。 您可以將它放在磁盤上,然后通過索引訪問它,它將保留在RAM中。 如果您使用Delphi,您應該使用自己的文件處理(您可以使用類似我們的BigTable庫進行存儲和索引訪問),或者使用數據庫(即使SQlite3能夠處理GB數據,因為它的限制大約是140TB ,具有SQL的強大功能,僅用於檢索數據)。
  • 如果你真的需要留在Java中 ,你可能會使用一些DB而不是簡單的內存結構。 您可以使用Java中的SQLite或純Java DB。 我懷疑它會減少你的內存消耗。

主要方法是:只在內存中保留所需內容,並使用Map / Reduce算法或某種索引。

如果您的問題是在Java和Delphi之間混合使用GUI

從我的實驗來看,這可能很難,因為JNI傾向於使用自己的線程,而VCL期望它的所有進程都在主線程中運行。

所以你可以:

  1. 創建一些Delphi方法,在從JNI調用時運行VCL Synchronize方法來更新屏幕。
  2. 依靠Windows GDI消息通信,即在Delphi代碼中創建自己的WM_USER *處理程序,然后通過發送一些低級PostMessage或SendMessage API從您的Java代碼中刷新屏幕內容。 按照設計,這將是線程安全的。
  3. 使用無狀態方法:我非常喜歡它。 就像在HTTP中一樣,用戶界面將充當客戶端,並定期詢問數據層(充當服務器)以獲取刷新的數據。 所有這些過程都將保留在主線程中,並且可以通過Timer輕松完成。 使用定時器,每次刷新500 ms的時間就足夠了,您的主應用程序將保持被動。

在所有情況下...

對於IPC,內存映射文件比套接字更快,但GDI消息在處理少量數據時是理想的。 套接字是很好的候選者,並且在本地機器上也會很快:如果傳輸的數據量僅為幾KB(例如高達1 MB),則內存映射文件的小開銷將不會顯着; 如果您需要創建應用程序的輕客戶端版本,它仍然可以工作。

你的答案的問題取決於你的要求(假設你有充分的理由以這種方式划分申請):

如果你需要做“瑣碎”的任務,即不需要太多的數據傳輸,那么使用套接字可能更好。 您需要創建一個協議,例如尊重字節順序。 還請注意,傳輸數據會降低您的gui響應速度。

如果需要傳輸大量數據,使用共享內存可能會更高效。 請注意,您需要自己完成簿記,這是通過tcp實現(例如發送/接收緩沖區)完成的。 使用此需要協議的問題變得更糟。

如果您想要一個簡單的實現,那么不要將應用程序分成兩個進程。 性能方面,這不是問題,但是您要在單個應用程序中添加高於復雜性的順序。 您需要有一個非常充分的理由將應用程序划分為多個過程,以克服您使用此架構提供相同功能所需的時間和精力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM