带有gui的IPC(Java和本机代码)

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

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

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

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

提前致谢.

解决方法:

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

如果您的RAM不足(如您的注释所建议-但您应该在主要问题中写得更好:您提供的详细信息越多,得到的答案越好).

为什么要混合使用Java和Delphi? Java可能不能很好地处理超过1 GB的内存,这是因为Java用于常规任务的内存消耗较高,并且具有内部GC.即使以64位运行JVM,也将面临新的扩展问题:您必须编写非常特定的代码才能使用Java处理大量内存.

公平地说,问题不是来自Delphi,而是来自Java内存消耗.因此,恕我直言,您最好用本机代码对数据层进行编码. Java可能会增加您的问题.

您可以:

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

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

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

从我的实验来看,这可能很困难,因为JNI倾向于使用自己的线程,而VCL希望其所有进程都在主线程中运行.

因此,您可以:

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

在所有情况下…

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

上一篇:Java和.NET 3.5之间的进程间通信的最佳方法是什么?


下一篇:IPC$ 命名管道