我试图通过设置标志退出Java(JNA)中的消息循环,但它无法正常工作。
这是我的代码:
public class MyClass() {
private class MyInnerClass() implements Runnable {
@Override
public void run() {
MSG msg = new MSG();
while(!quit && user32.GetMessage(msg, null, 0, 0) > 0) {
user32.TranslateMessage(msg);
user32.DispatchMessage(msg);
}
System.out.println("Exited message loop!");
}
} // MyInnerClass
private volatile boolean quit;
private final User32 user32;
public MyClass() {
quit = false;
user32 = User32.INSTANCE;
Thread myThread = new Thread(new MyInnerClass());
myThread.start();
}
public void quit() {
System.out.println("Entered quit()!");
quit = true;
}
} // MyClass
方法quit()
在回调中调用,该回调发生在代码中的其他位置。
屏幕上显示消息Entered quit()!
,但消息Exited message loop!
没有,并且线程一直在运行。
为什么在将quit
设置为true
时,消息循环不会停止?
答案 0 :(得分:0)
很可能你必须混淆一些类实例或调用函数BinaryTree
作为类的静态成员,或者在另一个未作为线程运行的对象上调用函数。你还需要检查对变量UPDATE Table1
SET Action = 'Insert'
FROM Table1
JOIN Table2 ON Table1.id = Table2.id
WHERE Table1.UID <> Table2.UID
的访问权限。我不是那么使用java的故障,但是它是否必须在一个类中设置并从另一个类读取?
java中有可能捕获变量吗?您必须创建quit()
,并且需要设置该变量quit
,该变量是new MyInnerClass()
但不是quit
。
您创建MyInnerClass
的实例,现在可以从MyClass
向外飞行。当具有可变MyInnerClass
的{{1}}对象从内存中释放并销毁时,MyClass
的实例如何访问MyInnerClass
的变量quit
?
答案 1 :(得分:0)
您无法访问内部类中外部类的变量。如果这样做,Java会将外部类变量的副本传递给内部类。这就是您没有收到编译器错误并且值不会更改的原因。
我找到了这个信息:
将变量声明为静态并通过外部类的名称访问它可能会有所帮助。
答案 2 :(得分:0)
问题是GetMessage
永远不会返回,因此循环条件while (!quit && GetMessage() > 0)
从未在第一次之后进行测试。
为了解决这个问题,我在JNA&#39; GitHub上提供的example之后重构了代码。
更具体地说,我将while (!quit)
移至while (GetMessage() > 0)
的单独帖子,并在System.exit(0)
退出时调用while (!quit)
。