java - 等待函数有逻辑错误

标签 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 中选定的框,以便图像会有所不同,它将继续没有问题。所以我想知道我是否做错了什么(除了在循环中调用 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/

相关文章:

java - 文件大小缓存和 Java 中文件大小的高效检索

java - Spring Boot Controller 重定向到/模板jsp页面不工作

java - 防止java中的无限循环

C程序无限循环

java - 如何比较java中各自包含原始类型和对象集合的两个对象?

java - 仅存储 24 小时变量值

ios - 如何从单个文本文件中提取不同语言的日期?

c - C 中的基本循环 - 如何求因子之和

sql - UPDATE 其中时间戳是最新的

c - 我的 C 程序陷入了 for 循环