我的应用程序由两部分组成-
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),则有关内存映射文件的少量开销将不会引起注意;并且如果您需要创建应用程序的轻量级客户端版本,它仍然可以使用.