我的申请由两部分组成 -
Java中的一些GUI逻辑。本机代码(主要是 Delphi)——GUI 实现本身。
Java 使用本机代码进行琐碎的操作,例如打开窗口和响应用户输入事件 - 实现是通过 JNI 完成的。
我有兴趣将双方划分为不同的进程 - 在不挂 gui 的情况下在它们之间实现 IPC 的最佳方法是什么?我倾向于 TCP 套接字或共享内存,但在我深入研究之前,我很想听听一些意见。性能和简单的实现是我主要关心的问题。
提前致谢。
我的申请由两部分组成 -
Java中的一些GUI逻辑。本机代码(主要是 Delphi)——GUI 实现本身。
Java 使用本机代码进行琐碎的操作,例如打开窗口和响应用户输入事件 - 实现是通过 JNI 完成的。
我有兴趣将双方划分为不同的进程 - 在不挂 gui 的情况下在它们之间实现 IPC 的最佳方法是什么?我倾向于 TCP 套接字或共享内存,但在我深入研究之前,我很想听听一些意见。性能和简单的实现是我主要关心的问题。
提前致谢。
如果您的问题与内存消耗有关
如果您的内存不足(正如您的评论所建议的那样 - 但您应该在主要问题中更好地写下这一点:您提供的详细信息越多,您得到的答案就越好)。
为什么要混合 Java 和 Delphi?Java 可能不适合处理超过 1 GB 的内存,因为它用于常见任务的内存消耗较高,而且它的内部 GC。即使您以 64 位运行 JVM,您也将面临新的扩展问题:您必须编写非常具体的代码来使用 Java 处理巨大的内存。
公平地说,问题不是来自 Delphi,而是来自 Java 内存消耗。因此,恕我直言,您应该更好地使用本机代码对数据层进行编码。Java 可能会增加您的问题。
您可以:
主要方法是:只在内存中保留需要的内容,并使用 Map/Reduce 算法或某种索引。
如果您的问题是在 Java 和 Delphi 之间混合 GUI
从我的实验来看,这可能很困难,因为 JNI 倾向于使用自己的线程,而 VCL 期望它的所有进程都在主线程中运行。
所以你可以:
在所有情况下...
对于 IPC,内存映射文件比套接字快,但 GDI 消息在处理少量数据时是理想的。套接字是很好的候选者,并且在本地机器上也很快:如果传输的数据量只有几 KB(例如高达 1 MB),内存映射文件的小开销将不会很明显;如果您需要创建应用程序的轻客户端版本,它仍然可以工作。
您回答的问题取决于您的要求(假设您有充分的理由以这种方式划分应用程序):
如果您需要执行“琐碎”的任务,即不需要太多的数据传输,那么使用套接字可能会更好。尽管如此,您仍需要创建一个协议,例如尊重字节顺序。另请注意,传输数据会减慢您的 gui 响应速度。
如果您需要传输大量数据,使用共享内存可能会更高效。请注意,这里您需要自己进行簿记,这是由 tcp 实现完成的(例如发送/接收缓冲区)。使用这个需要协议的问题变得更糟。
如果您想要一个简单的实现,那么不要将应用程序分成两个进程。就性能而言,这不是问题,但是您在单个应用程序所需的复杂性之上增加了一个复杂度。您需要有充分的理由将应用程序划分为多个进程,以克服使用此架构交付相同功能所花费的时间和精力。