为什么/应用程序如何保留由另一个进程创建的互斥引用?

时间:2009-09-02 06:44:22

标签: java vb6 winapi mutex launch4j

我有一个不寻常的过程结构:

  1. Launch4J启动我的Java应用程序。它创建了一个互斥体来提供单实例功能。
  2. Java应用程序启动VB6应用程序。
  3. 当Java应用程序终止时,VB6应用程序仍在运行。 (期望的行为)
  4. 问题是:Launch4J创建的互斥锁仅在VB6应用程序终止后才会释放。因此,再也无法启动Java应用程序。

    为什么会这样?我没有明确地打开互斥锁...

    我首先怀疑这是因为Java使用CreateProcessbInheritHandles == true,但是当我启动notepad.exe时问题不会出现。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

JVM关闭后,互斥锁仍由新进程保留。

我发现避免互斥量被继承的最简单解决方案是使用一个中间程序,该程序在不继承父句柄的情况下将进程作为独立进程启动。

可以在这里https://stackoverflow.com/a/1582197/6894604

找到该程序的有效c ++示例。

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

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

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

答案 2 :(得分: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