我已经创建了一个程序,可以在我的营业地点自动执行某些功能,但我正在尝试虚拟证明它不会出错,我遇到了一个不应该发生的错误。
基本上我的方法正在做的是等待电子表格停止填充并自动格式化,以便我可以用它来做其他一些事情。所有这些方法都要做的是拍摄屏幕截图,等待,拍摄另一个屏幕截图,如果它们相同则继续,如果不等待一些。
这是方法。
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中移动所选框以使图像不同,它将继续没有问题。所以我想知道是否有任何我做错了(除了在循环中调用一个等待(一个Thread.sleep))这会导致我的程序出现这个逻辑错误。
编辑: 这个问题不是每次都会发生,只有大约1/4的时间。 这个问题得到了解决,错误就是干预。它应该是
do{
running = WaitTillDone();
wait(800);
}while(!running);
谢谢大家的帮助。
答案 0 :(得分:1)
查看此代码,您似乎可以将WaitTillDone重命名为WaitTillScreenShotDifferentIn4SecountSnapshots
只要图像与4秒前相同,它就会重新进入循环。
因此,如果您输入循环,在完成所有更改后,您将永远不会退出。
我认为这里发生的事情是,在四分之一的情况下,Excel对您来说太快了,并且在您进入循环之前完成了更改。
例如,如果您的初始图像是y,并且您在时间0输入了执行循环:
这将永远循环,直到屏幕截图再次发生变化:
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