1

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

基本上我的方法是等到电子表格停止被填充和自动格式化,这样我就可以用它做一些其他的事情。所有这个方法所要做的就是截屏,等待,再截屏,如果它们相同,则继续,如果不等的话。

这里是方法。

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 中移动选定的框,以便图像会有所不同,它将继续没有问题。所以我想知道我是否做错了什么(除了在循环中调用等待(a Thread.sleep))会导致我的程序出现这个逻辑错误。

编辑:这个问题并不是每次都发生,只有大约 1/4 的时间。这个问题解决了,错误是do-while条件。它应该是

do{
    running = WaitTillDone();
    wait(800);
}while(!running);

谢谢大家的帮助。

4

1 回答 1

1

查看此代码,您似乎可以将 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
于 2013-06-13T18:22:30.087 回答