2013-06-11 2 views
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, чтобы изображения были разными, он будет продолжаться без проблем. Поэтому мне было интересно, есть ли что-то, что я делал неправильно (помимо вызова wait (Thread.sleep) в цикле), что приведет к тому, что моя программа получит эту логическую ошибку.

EDIT: Эта проблема не возникает каждый раз, только около 1/4 раза. Эта проблема решена, ошибка заключалась в том, чтобы сделать это. Предполагалось, что это должно быть

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

Благодарим всех вас за помощь.

+0

, что является причиной добавления ** ожидания (4000) ** функция ** WaitTillDone() ** ** между image1 ** и ** ** iMAGE2 инициализации? –

+0

, чтобы электронная таблица продолжала заполняться и форматироваться. Если бы у меня не было ожиданий, значит, изображения будут слишком быстрыми и дадут ложный результат. Подумайте об этом таким образом, вы делаете снимки на «регулярном» интервале, чтобы увидеть, когда все движение остановится. –

+0

Я думаю, вам нужно отлаживать различия с изображениями. Я сомневаюсь, что ошибка в логике выше, и, скорее всего, что-то происходит с изображениями, поскольку только один пиксель должен быть другим. Вы можете рассмотреть процентный порог, например, 0,1% или 100 пикселей.Возможно ли, что когда Excel находится в состоянии ожидания, он редактирует цвет курсора или что-то в этом роде. –

ответ

1

Глядя на этот код, кажется, вы могли бы переименовать WaitTillDone в WaitTillScreenShotDifferentIn4SecountSnapshots

Пока изображение так же, как это было 4 секунды назад, он будет повторно ввести петлю.

Так, если вы, например, вводите свой цикл, после того, как все изменения уже сделаны, вы никогда не выйдете из него.

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

Например, если ваш первоначальный образ у, и вы вводите ваш делать петлю в момент времени 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 
+0

спасибо! Я не могу поверить, что я совершил такую ​​глупую ошибку. Я просто изменил время на работу, и он работает отлично. Спасибо, что заметили мою ошибку. –

Смежные вопросы