我希望我能清楚地解释清楚。我想以编程的方式从外部以一种“礼貌”的方式停止一个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。我们有很多小程序要测试/运行,框架必须一个接一个地运行它们,而不需要用户交互。
我考虑的方法是:
制作一个 WM_CLASS 属性包含 sun-applet-main 的窗口列表 并在 exec()之后,并对列表进行区分以找出哪些窗口 在 exec()之后打开。
编写我自己的appletviewer并制作它 接受 SIGUSR1 并关闭小程序,例如,通过调用 destroy()方法。
有更好的建议吗?
答案 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及更早版本设定的。