从外部以编程方式停止applet

时间:2013-10-07 23:15:35

标签: java applet window exec

我希望我能清楚地解释清楚。我想以编程的方式从外部以一种“礼貌”的方式停止一个applet,它仍会返回一个状态码0。

更多细节:我正在开发一个exec()s“appletviewer embed.html”的测试/基准测试框架,并获得由此启动的进程的pid。我一直在做的是等待五秒钟,然后打开X显示并搜索 _NET_WM_PID 属性等于pid的窗口,并将 WM_DELETE_MESSAGE 发送到该窗口。但是,这仅适用于Java 1.5及更高版本,因为1.4及以下版本不设置 _NET_WM_PID ,因此我找不到刚刚打开的窗口。

要明确一点:使用 signal()并不是我想要的,因为applet的关闭应该是“正常”,即不应该使appletviewer返回非零。

再说一遍:这是一个测试/基准测试框架;停止必须由框架启动,而不是通过修改applet。我们有很多小程序要测试/运行,框架必须一个接一个地运行它们,而不需要用户交互。

我考虑的方法是:

  1. 制作一个 WM_CLASS 属性包含 sun-applet-main 的窗口列表 并在 exec()之后,并对列表进行区分以找出哪些窗口 在 exec()之后打开。

  2. 编写我自己的appletviewer并制作它 接受 SIGUSR1 并关闭小程序,例如,通过调用 destroy()方法。

  3. 有更好的建议吗?

1 个答案:

答案 0 :(得分:0)

appletviewer的 -debug 选项提供了答案:

 (echo run;sleep 5;echo exit) | appletviewer -debug embed.html

我将在基准测试框架中执行此操作,但上面的shell-command表单更清楚地显示了这个想法。

对原始问题的更正:_NET_WM_PID属性由Java 1.7及更高版本中的appletviewer设置。它不是由1.6及更早版本设定的。