Функция ожидания имеет логическую ошибку

Я создал программу, которая автоматизирует определенные функции на моем рабочем месте, но я пытаюсь проверить ее на фиктивном уровне, чтобы она не могла пойти не так, как надо, и я столкнулся с ошибкой, которой не должно было происходить.

По сути, мой метод ждет, пока электронная таблица не перестанет заполняться и автоматически форматироваться, чтобы я мог делать с ней что-то еще. Все, что нужно сделать этому методу, это сделать снимок экрана, подождать, сделать еще один снимок экрана и, если они совпадают, продолжить, если нет, подождать еще немного.

вот методы.

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

Спасибо за вашу помощь.


person Joel Newman    schedule 11.06.2013    source источник
comment
в чем причина добавления wait(4000) в функцию WaitTillDone() между инициализацией image1 и image2?   -  person AvmnuSng    schedule 11.06.2013
comment
чтобы электронная таблица продолжала заполняться и форматироваться. Если бы у меня не было ожидания там, то изображения снимались бы слишком быстро и давали бы ложное срабатывание. Подумайте об этом так: вы делаете снимки через равные промежутки времени, просто чтобы увидеть, когда все движение остановится.   -  person Joel Newman    schedule 11.06.2013
comment
Я думаю, вам нужно отладить различия с изображениями. Я сомневаюсь, что ошибка в приведенной выше логике, и, скорее всего, что-то происходит с изображениями, поскольку должен отличаться только один пиксель. Вы можете рассмотреть процентный порог, например 0,1% или 100 пикселей. Возможно ли, что когда Excel находится в каком-то состоянии ожидания, он редактирует цвет курсора или что-то в этом роде.   -  person John B    schedule 11.06.2013
comment
@JohnB Я изначально придерживался такой концепции, у меня были допуски, чтобы до 50 пикселей могли отличаться, но, как оказалось, это были критические 50 пикселей полосы прокрутки, которая уменьшалась и показывала движение. Теоретически да, это то, что я хотел бы сделать, но на практике на маленьком экране значение px слишком важно. Кроме того, почему это должно работать, когда я нажимаю кнопку, чтобы изменить изображение? как только выделена другая ячейка и она повторно сканирует, она работает.   -  person Joel Newman    schedule 11.06.2013
comment
Я не знаю. Кажется, что-то периодически изменяет изображение, например, мигание курсора и т. Д. Возможно, когда вы переходите в новую ячейку, курсор больше не присутствует / мигает. Я бы посоветовал вам сохранить два изображения, чтобы сравнить их визуально.   -  person John B    schedule 11.06.2013
comment
После проверки их вручную я не могу найти ничего, что отличалось бы между двумя изображениями, поэтому я вернулся к первому шагу со своей проблемой.   -  person Joel Newman    schedule 13.06.2013


Ответы (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
person Kyle Shanafelt    schedule 13.06.2013
comment
спасибо! Не могу поверить, что совершил такую ​​глупую ошибку. Я только что изменил время на !running, и он отлично работает. Спасибо, что заметили мою ошибку. - person Joel Newman; 14.06.2013