java - 带图形用户界面的 IPC(Java 和 native 代码)

标签 java delphi ipc multiprocessing native-code

我的应用程序由两部分组成 -

Java 中的一些 GUI 逻辑。 native 代码(主要是 Delphi)- GUI 实现本身。

Java 使用 native 代码进行琐碎的操作,例如打开窗口和响应用户输入事件 - 实现是通过 JNI 完成的。

我有兴趣将双方划分为不同的流程 - 在不挂起 gui 的情况下在它们之间实现 IPC 的最佳方法是什么? 我倾向于 TCP 套接字或共享内存,但在我深入研究之前,我很想听听一些意见。 性能和简单的实现是我主要关心的问题。

提前致谢。

最佳答案

如果您的问题与内存消耗有关

如果您的 RAM 不足(正如您的评论所建议的那样 - 但您最好将其写在您的主要问题中:您提供的细节越多,您得到的答案就越好)。

为什么要混合使用 Java 和 Delphi? Java 可能不是一个处理超过 1 GB 内存的好候选者,因为它对常见任务的内存消耗更高,而且它的内部 GC。即使您以 64 位运行 JVM,您也会面临新的扩展问题:您必须编写非常具体的代码来使用 Java 处理巨大的内存。

公平地说,问题不是来自Delphi,而是来自Java 内存消耗。因此,恕我直言,您应该更好地使用 native 代码编写数据层。 Java 可能会增加您的问题。

你可以:

  • 使用Free Pascal Compiler从 Delphi 代码编译 64 位库,然后从主 32 位 Delphi 应用程序或使用 JNI 的 Java 使用 Memory Mapped file as bridge 调用它.
  • 改变访问数据的方式。您可能不需要一次拥有所有这些千兆字节的数据。您可以将它放在磁盘上,然后通过索引访问它,索引将保留在 RAM 中。如果您使用 Delphi,您应该使用自己的文件处理(您可以使用类似我们的 BigTable library 的存储和索引访问),或者使用数据库(甚至 SQlite3 is able to handle GB of data,因为它的限制约为 140 TB,具有强大的功能用于仅检索数据的 SQL)。
  • 如果您真的需要留在 Java,您可能会使用一些 DB 而不是普通的内存结构。您可以使用来自 Java 的 SQLite 或纯 Java 数据库。我怀疑它会减少你的内存消耗。

主要方法是:只在内存中保留需要的内容,并使用 Map/Reduce 算法或某种索引。

如果您的问题是在 Java 和 Delphi 之间混合使用 GUI

根据我的实验,这可能很困难,因为 JNI 倾向于使用自己的线程,而 VCL 期望它的所有进程都在主线程中运行。

所以你可以:

  1. 创建一些 Delphi 方法,在从 JNI 调用时运行 VCL Synchronize 方法以更新屏幕。
  2. 依靠 Windows GDI 消息通信,即在 Delphi 代码中创建您自己的 WM_USER* 处理程序,然后通过发送一些低级 PostMessage 或 SendMessage API 刷新您的 Java 代码的屏幕内容。按照设计,这将是线程安全的。
  3. 使用无状态方法:我非常喜欢。就像在 HTTP 中一样,您的用户界面将充当客户端,并会定期向数据层(充当服务器)请求刷新数据。所有这些过程都将保留在主线程中,并且可以通过计时器轻松完成。使用计时器,每次刷新 500 毫秒就足够了,您的主应用程序将保持 react 状态。

在所有情况下......

对于 IPC,内存映射文件比套接字快,但 GDI 消息在处理少量数据时是理想的。套接字是很好的选择,并且在本地机器上也很快:如果传输的数据量只有几 KB(例如最多 1 MB),则内存映射文件的小开销不会引人注意;如果您需要创建应用程序的轻型客户端版本,它仍然可以工作。

关于java - 带图形用户界面的 IPC(Java 和 native 代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6405277/

相关文章:

delphi - TTabControl 的标题

C: MAC OS X 中的信号量意外 sem_close 错误

c++ - 如何在 VCL 应用程序中处理已发布、已注册的 Windows 消息?

当进程终止时Python锁就会消失

java - 如何在没有 web.xml 的情况下将 App Engine 项目更新到 Java 11?

java - 通过其他类构造函数在主方法中创建对象时访问对象属性

delphi - 使用 Ant 配置 Sonar 模块的 build.xml 文件

java桌面应用程序本地化

java - 获取数组中的受限组合

json - 如何将 Delphi XE 10 中的 JSON 字符串返回的日期时间解析为 TDateTime