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

带gui的IPC(Java和本机代码),java,delphi,ipc,multiprocessing,native-code,Java,Delphi,Ipc,Multiprocessing,Native Code,我的申请由两部分组成- Java中的一些GUI逻辑。 本机代码(主要是Delphi)——GUI实现本身 Java使用本机代码进行一些琐碎的操作,如打开窗口和响应用户输入事件——实现是通过JNI完成的 我对将双方划分为不同的流程感兴趣- 在不挂起gui的情况下,在它们之间实现IPC的最佳方法是什么? 我倾向于使用TCP套接字或共享内存,但在深入讨论之前,我希望听到一些输入。 性能和简单的实现是我主要关心的问题 提前感谢。您回答的问题取决于您的需求(假设您有很好的理由以这种方式划分应用程序): 如果

我的申请由两部分组成-

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

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

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


提前感谢。

您回答的问题取决于您的需求(假设您有很好的理由以这种方式划分应用程序):

如果您需要执行“琐碎”任务,即不需要太多的数据传输,那么最好使用套接字。然而,您需要创建一个协议,例如尊重字节顺序。还请注意,传输数据会减慢gui响应速度


如果需要传输大量数据,使用共享内存可能会更有效。请注意,这里您需要自己记账,这是由tcp实现完成的(例如,发送/接收缓冲区)。使用这种方法,需要协议的问题变得更加严重。

如果您想要一个简单的实现,那么不要将应用程序分成两个进程。就性能而言,这不是一个问题,但您增加的复杂性顺序高于单个应用程序所需的复杂性顺序。您需要有一个非常好的理由将应用程序划分为多个进程,以克服使用此架构提供相同功能所需的时间和精力。

如果您的问题是关于内存消耗的

如果您的内存不足(正如您的评论所建议的,但您最好在主要问题中写下这一点:您给出的细节越多,您得到的答案就越好)

为什么要混合使用Java和Delphi?Java可能不适合处理超过1GB的内存,因为它对普通任务的内存消耗更高,而且它的内部GC。即使您以64位运行JVM,您也将面临新的扩展问题:您必须编写非常特定的代码来使用Java处理巨大的内存

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

你可以:

  • 使用从Delphi代码编译64位库,然后从主32位Delphi应用程序或使用JNI从Java使用调用它
  • 更改访问数据的方式。您可能不需要同时拥有所有这些千兆字节的数据。您可以将它放在磁盘上,然后通过索引访问它,索引将保留在RAM中。如果您使用Delphi,那么您应该使用自己的文件处理(您可以使用类似于我们的文件来进行存储和索引访问),或者使用数据库(即使它的限制约为140 TB,SQL的功能仅用于检索数据)
  • 如果您真的需要留在Java中,您可能会使用一些DB而不是普通的内存结构。您可以使用来自Java的SQLite,也可以使用纯JavaDB。我怀疑这会减少你的内存消耗
主要方法是:只在内存中保存所需的内容,并使用Map/Reduce算法或某种索引


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

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

所以你可以:

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


    对于IPC,内存映射文件比套接字更快,但GDI消息在处理少量数据时非常理想。套接字是很好的候选者,在本地计算机上也会很快:如果传输的数据量只有几KB(例如,高达1MB),那么内存映射文件的小开销就不会明显;如果您需要创建应用程序的轻客户端版本,它仍然可以工作。

    根据我有限的经验,Sockets可以很好地实现这一点。如果您的GUI是Swing GUI,则需要注意在后台线程上完成进程间通信。我不明白您为什么要这样做。多进程对我来说听起来更复杂。Delphi无法在64位操作系统上编译。另外,本机代码在极端情况下有崩溃的趋势。@奇怪的是,它在不同的进程中也会崩溃。64位编译器即将推出。FreePascal非常好,可以实现64位。在64位操作系统上运行32位代码有什么问题?32位进程被限制为4GB(甚至更低),我的应用程序很容易因为OutOfMemory异常而崩溃。即使64位编译器面世,它也是全新的,因此容易出现错误。当只有本机端崩溃时,另一个进程可以识别该崩溃并优雅地退出或恢复。信任m