java.awt.Robot を使用してデスクトップリモコンアプリケーションを作成し、正常に動作しています。アプリケーションが別のアプリケーション システムに統合されているため、外部システムからリモート コントロールを開始/停止できるようにしたいのですが、奇妙な問題が見つかりました - ロボットを停止できません。
私はいくつかのことを試しました:スレッド内で実行し(スレッドを停止できるように)、ロボットオブジェクトをnullにし、System.gc()を呼び出すよりも問題はありませんが、まだ実行中のロボットスレッドです(他のすべてが破壊された後) )。デバッグでは、実行中のスレッドが表示されます: Daemon Thread [AWT-Windows] (Running)。
私の問題を再現するコードは次のとおりです。
public class RobotDestroy {
public static void main(String[] args) {
try {
Robot r = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
}
似たようなことを経験した人はいますか?解決策はありますか?
ありがとう
編集:
以下は、停止可能なスレッドで Robot を実行しているが、Robot インスタンスがまだ実行中の例です。
public class RobotDestroy {
public static void main(String[] args) {
RobotThread rt = new RobotThread();
rt.start();
try {
//do some work before thread shut down
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
rt.shutdown();
}
private static class RobotThread extends Thread {
public Robot robot;
volatile boolean alive;
public RobotThread(){
try {
this.robot = new Robot();
this.alive = true;
} catch (AWTException e) {
e.printStackTrace();
}
}
public void run(){
while(alive){
System.out.println("alive");
try{
robot.delay(5000);
sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
}
public void shutdown(){
this.alive = false;
robot = null;
System.out.println("shutdown");
}
}
}
編集 2
ドクター キラーが提案したことを試してみましたが、これは良い提案ですが、ロボット スレッドはまだ実行中です。それを証明する最善の方法は、ロボット インスタンスの作成前と作成後にスレッドを出力することです。
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
for (int i = 0; i < threadArray.length; i++) {
System.out.println(threadArray[i].getName());
}
更新: 多くのデバッグの後、問題が java.awt.Robot クラスにないことに気付きました。アプリケーションの終了後も実行されている AWT-Window スレッドを開始するのは java.awt.Toolkit です。Robot オブジェクトには、((ComponentFactory)toolkit).createRobot(this, screen); によって返される RobotPeer (java.awt.peer.RobotPeer) があります。