我试图通过设置一个标志来退出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时,为什么消息循环没有停止
发布于 2018-02-20 02:28:20
问题是GetMessage永远不会返回,所以循环条件while (!quit && GetMessage() > 0)在第一次之后永远不会被测试。
为了解决这个问题,我按照JNA的GitHub上提供的example重构了代码。
更具体地说,我将while (!quit)移到了一个独立于while (GetMessage() > 0)的线程中,在while (!quit)退出时调用System.exit(0)。
发布于 2018-02-15 04:10:01
很可能你不得不混淆一些类实例,或者调用函数quit()作为类的静态成员,或者调用另一个没有作为线程运行的对象上的函数。你还需要检查对变量quit的访问,我对java不是很熟悉,但是你必须在一个类中设置并从另一个类中读取的变量是相同的吗?
在java中可以捕获变量吗?您必须创建new MyInnerClass(),并且需要设置变量quit,它是MyInnerClass的成员,但不是MyClass的成员。
您创建了MyInnerClass的实例,它现在可以自由地从MyClass飞出。当带有可变quit的MyClass的对象从内存中释放并被销毁时,MyClass的实例如何访问MyClass的变量quit?
发布于 2018-02-15 04:24:44
不能在内部类中访问外部类的变量。如果这样做,Java会将外部类变量的副本传递给内部类。这就是为什么你没有得到一个编译器错误和值不会改变的原因。
我找到了这个信息:
将变量声明为静态并通过外部类的名称访问它可能会有所帮助。
https://stackoverflow.com/questions/48795355
复制相似问题