等待功能有逻辑错误

时间:2013-06-11 15:32:47

标签: java logic infinite-loop awtrobot thread-sleep

我已经创建了一个程序,可以在我的营业地点自动执行某些功能,但我正在尝试虚拟证明它不会出错,我遇到了一个不应该发生的错误。

基本上我的方法正在做的是等待电子表格停止填充并自动格式化,以便我可以用它来做其他一些事情。所有这些方法都要做的是拍摄屏幕截图,等待,拍摄另一个屏幕截图,如果它们相同则继续,如果不等待一些。

这是方法。

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);

谢谢大家的帮助。

1 个答案:

答案 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