Я создал программу, которая автоматизирует определенные функции на моем рабочем месте, но я пытаюсь проверить ее на фиктивном уровне, чтобы она не могла пойти не так, как надо, и я столкнулся с ошибкой, которой не должно было происходить.
По сути, мой метод ждет, пока электронная таблица не перестанет заполняться и автоматически форматироваться, чтобы я мог делать с ней что-то еще. Все, что нужно сделать этому методу, это сделать снимок экрана, подождать, сделать еще один снимок экрана и, если они совпадают, продолжить, если нет, подождать еще немного.
вот методы.
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-while. Это должно было быть
do{
running = WaitTillDone();
wait(800);
}while(!running);
Спасибо за вашу помощь.