while循环未执行

4
我正在开发一个Java项目,其中通过串口将外部微控制器设备连接到计算机。在Java应用程序中,我有一个等待对话框,等待微控制器设备执行命令。如果微控制器在10秒内没有响应,应用程序就会关闭。
问题是某些命令太快了,在等待对话框变为活动状态之前,微控制器就已经回应了。这导致应用程序在十秒后关闭。
以下是我最初想到的等待对话框变为可见的第一个想法:
new Thread() {
    public void run() {
         while (!Main.mainFrame.waitDialog.isVisible()) {}
         Main.usbManager.start();
    }
}.start();

但是应用程序在while循环中卡住了,并且等待对话框可见,但如果我添加一些随机的句子到while循环中,例如System.out.flush();,它就可以正常工作,当对话框可见时,程序从while循环退出。

我该如何等待对话框可见?

谢谢

2个回答

5

大多数GUI库都是单线程的。这意味着对它的调用可能不是线程安全的,您不能保证会看到变化。特别是boolean值可以内联,因此在某个时间点之后,您可以确定不会看到值的更改。

如果您使用的东西减慢了循环速度,它将不会优化代码一段时间(这是不可靠的),或者像System.out.flush()一样具有内存屏障,则不会发生此优化。

更好的轮询方式可能是使用Thread.yield()Thread.sleep(40)来节省一些CPU。


3
我认为.isVisible()方法存在问题,并且while循环的使用普遍失败。
如果我在while循环中添加一些随机句子,例如System.out.flush();,它就能工作了。
关于while循环,有一个类似问题的问题 "Why does while(true) loop just run once - Java",它可以通过像System.out.println()这样的随机方法运行。
我认为你应该在此线程中调用某些内容,当其他线程中的实际窗口关闭时,在此线程中不必等待。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接