我已经创建了一个程序,可以在我的营业地点自动执行某些功能,但我正在尝试对其进行虚拟证明,以便它不会出错,并且我遇到了不应该发生的错误。
基本上我的方法正在做的是等待电子表格停止填充和自动格式化,以便我可以用它做一些其他事情。该方法所要做的就是拍摄一个屏幕截图,等待,再拍摄一个屏幕截图,如果它们相同,则继续,如果不一样,请再等待一段时间。
这里是方法。
private boolean WaitTillDone() {
BufferedImage image1;
BufferedImage image2;
image1 = siri.createScreenCapture(new Rectangle(0,0,width,height-80));
wait(4000);
image2 = siri.createScreenCapture(new Rectangle(0,0,width,height-80));
boolean same = bufferedImagesEqual(image1,image2);
return same;
}
public boolean bufferedImagesEqual(BufferedImage img1, BufferedImage img2) {
if (img1.getWidth() == img2.getWidth() && img1.getHeight() == img2.getHeight() ) {
for (int x = 0; x < img1.getWidth(); x++) {
for (int y = 0; y < img1.getHeight(); y++) {
if (img1.getRGB(x, y) != img2.getRGB(x, y) ) return false;
}
}
}
else {
return false;
}
return true;
}
这是调用它的循环。
do{
running = WaitTillDone();
wait(800);
}while(running);
程序循环正常,但有时当图像不相同并且必须等待时,它会进入“无限”循环。我说“无限”是因为如果没有任何用户输入,它就不会继续。但是,如果我按任何箭头按钮或输入只是为了移动 Excel 中选定的框,以便图像会有所不同,它将继续没有问题。所以我想知道我是否做错了什么(除了在循环中调用 wait (a Thread.sleep) 之外)会导致我的程序出现此逻辑错误。
编辑: 这个问题并不是每次都会出现,大约只有1/4的时候出现。 这个问题解决了,错误是do-while条件。本来应该是
do{
running = WaitTillDone();
wait(800);
}while(!running);
感谢大家的帮助。
最佳答案
看看这段代码,似乎您可以将 WaitTillDone 重命名为 WaitTillScreenShotDifferentIn4SecountSnapshots
只要图像与4秒前相同,就会重新进入循环。
因此,如果您进入循环,在完成所有更改后,您将永远不会退出它。
我认为这里发生的情况是,在四分之一的情况下,Excel 对您来说速度太快,并且在您进入循环之前就完成了更改。
例如,如果您的初始图像是 y,并且您在时间 0 进入 do-loop:
这将永远循环,直到屏幕截图再次更改:
time (s): Image
-1 y
0 x
1 x
2 x
3 x
4 x
这可能是大多数时候发生的情况:
time (s): Image
-1 y
0 y
1 y or x
2 y or x
3 y or x
4 x
关于java - 等待函数有逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17048097/