2

我有这个有点不寻常的流程结构:

  1. Launch4J 启动我的 Java 应用程序。它创建一个互斥体来为 Java 应用程序提供单实例功能。
  2. Java 应用程序启动一个可以有多个实例的 VB6 应用程序。
  3. 当 Java 应用程序终止时,VB6 应用程序仍在运行。(期望的行为)

问题是:Launch4J 创建的互斥锁只有在 VB6 应用程序终止后才会释放。因此,无法再次启动 Java 应用程序。

为什么会发生这种情况?我没有明确地打开互斥锁......

我首先怀疑这是因为 Java 使用CreateProcesswith bInheritHandles == true,但是当我开始时问题并没有出现notepad.exe

编辑:我仍然有这个问题。任何指针表示赞赏!

4

3 回答 3

1

Launch4J 是否在终止前释放互斥锁并关闭其句柄?很抱歉,但我不知道 Java 如何包装 OS Mutex 函数,但您应该确保在线程结束之前显式释放互斥锁并关闭其句柄。

于 2009-09-03T08:55:17.300 回答
1

我遇到了同样的问题,并意识到 Launch4J 在启动时创建了一个可继承的互斥锁,当从 JVM 启动一个进程时,这个互斥锁然后被新进程继承。

JVM 关闭后,互斥锁仍由新进程持有。

我发现避免继承互斥体的最简单解决方案是使用中间程序,将进程作为分离进程启动,而不继承父句柄。

可以在此处找到该程序的工作 c++ 示例https://stackoverflow.com/a/1582197/6894604

只需使用 c++ 编译器编译程序(“ex: rujob.exe”)并更改命令以使用启动器而不是直接调用进程,例如:

new ProcessBuilder().command(
           "runjob.exe", 
           "vbprogram.exe", 
           "/PARAM1", 
           "/PARAM2").start();

这样,您的 VB 程序将不会继承 java 应用程序互斥体,也不会阻止您的 java 应用程序重新启动。

于 2020-12-13T10:47:43.610 回答
0

为什么不使用 VB 而不是 java 提供单实例功能?IMO 使用 Launch4j 为 VB 应用程序提供单个实例是错误的。还有其他方法,请检查:

https://www.vbforums.com/showthread.php?342810-Classic-VB-How-can-I-allow-only-one-instance-of-my-application-to-run-at-a-time

于 2020-08-31T07:28:43.110 回答