我正在开发一个java项目,其中外部微控制器设备通过串行端口连接到计算机。我在java应用程序中有一个等待对话框,等待命令在微控制器设备上执行。如果微控制器在10秒内没有响应,则应用程序将关闭。
问题是某些命令太快,微控制器在等待对话框变为活动状态之前响应。这会导致应用程序在十秒钟后关闭。
这是我想要等待对话框可见的第一个想法:
new Thread() {
public void run() {
while (!Main.mainFrame.waitDialog.isVisible()) {}
Main.usbManager.start();
}
}.start();
但是应用程序停留在while循环中并且等待对话框是可见的,但是如果我向while循环添加一些随机语句,例如System.out.flush();
,它可以工作,当对话框可见时程序退出while循环。
我如何等待对话框可见?
由于
答案 0 :(得分:5)
大多数GUI库都是单线程的。这意味着对它的调用可能不是线程安全的,您永远不能保证看到更改。特别是boolean
值可以内联,因此您可以确定在某一点之后您不会看到值的变化。
如果你使用的东西会减慢循环,它会暂时不优化代码(这是不可靠的)或者像System.out.flush()
那样有内存障碍,那么这种优化就不会发生。< / p>
更好的投票方法可能是使用Thread.yield()
或Thread.sleep(40)
来节省一些CPU。
答案 1 :(得分:3)
我认为.isVisible()方法存在问题,而while循环的一般失败使用。
如果我在while循环中添加一些随机句子,例如System.out.flush();,它可以正常工作
在while循环中有一个类似问题“Why does while(true) loop just run once - Java”的问题
它使用System.out.println()
等随机方法运行
我认为你应该在另一个线程中的实际窗口在这个线程中关闭时调用一些东西,所以你不必等待。