gpt4 book ai didi

java - 将 Windows 命名管道用于 IPC 的一种有效方法

转载 作者:行者123 更新时间:2023-12-04 23:22:22 27 4
gpt4 key购买 nike

我正在使用 jna模块来连接两个都执行 FFMPEG 命令的进程。发送 SDTOUT服务器端的 FFMPEG 命令发送到 NampedPipe 并接收 STDIN从 NampedPipe 获取客户端上的其他 FFMPEG 命令。
这就是我捕获 STDOUT 的方式并发送到服务器端的管道中:

InputStream out = inputProcess.getInputStream();
byte[] buffer = new byte[maxBufferSize];
while (inputProcess.isAlive()) {
int no = out.available();
if (no > 0 && no > maxBufferSize) {
int n = out.read(buffer, 0,maxBufferSize);
IntByReference lpNumberOfBytesWritten = new IntByReference(maxBufferSize);
Kernel32.INSTANCE.WriteFile(pipe, buffer, buffer.length, lpNumberOfBytesWritten, null);
}
}
这就是我捕获 STDIN 的方式并将其提供给客户端:
OutputStream in = outputProcess.getOutputStream();
while (pipeOpenValue >= 1 && outputProcess.isAlive() && ServerIdState) {
// read from pipe
resp = Kernel32.INSTANCE.ReadFile(handle, readBuffer,readBuffer.length, lpNumberOfBytesRead, null);
// Write to StdIn inputProcess
if (outputProcess != null) {
in.write(readBuffer);
in.flush();
}
// check pipe status
Kernel32.INSTANCE.GetNamedPipeHandleState(handle, null,PipeOpenStatus, null, null, null, 2048);
pipeOpenValue = PipeOpenStatus.getValue();
WinDef.ULONGByReference ServerId = new WinDef.ULONGByReference();
ServerIdState = Kernel32.INSTANCE.GetNamedPipeServerProcessId(handle, ServerId);
}
但是我遇到了两个问题:
  • 由于在服务器和客户端中迭代两个循环,CPU 使用率很高。 (通过 VisualVM 分析资源来查找)
  • 比仅使用常规 | 连接两个 FFMPEG 命令更慢的操作在命令提示符下。速度取决于缓冲区大小,但大缓冲区大小会阻止操作,小缓冲区大小会进一步降低速度。

  • 问题:
  • 有没有办法不发送和接收字节 block ?只是流STDOUT到 Namedpipe 并在 Client 中捕获它。 (消除两个循环)
  • 如果我不能使用 NampedPipe,有没有其他方法可以连接两个在不同 java 模块中但在同一台机器上运行的 FFMPEG 进程?

  • 谢谢

    最佳答案

    似乎您一直在服务器端轮询进程状态标准输入,而无需等待任何事件或使线程 hibernate 。
    可能你想看看这里:
    Concurrent read/write of named pipe in Java (on windows)
    干杯!

    关于java - 将 Windows 命名管道用于 IPC 的一种有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63097736/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com