2013-06-11 51 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)),這會導致我的程序有這個邏輯錯誤。

編輯: 這個問題不是每次都發生,只有大約1/4的時間。 這個問題已經解決了,錯誤是這個do-while condidtion。它應該是

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

謝謝大家的幫助。

+0

背後是什麼加**等待(4000)**的**功能image1的**和** **圖像2之間的初始化** WaitTillDone()**的原因是什麼? –

+0

以允許電子表格繼續被填充和格式化。如果我沒有在那裏等待,那麼它會以太快的速度拍攝圖像,並給出誤報。您可以這樣想,您正在以「常規」間隔拍攝快照,以查看所有移動何時停止。 –

+0

我認爲你需要調整與圖像的差異。我懷疑錯誤是在上面的邏輯中,更可能是因爲只有一個像素必須有所不同,因此圖像會發生一些變化。您可能會考慮百分比閾值,如0.1%或100 px。有可能當Excel處於某種等待狀態時,它正在編輯光標的顏色或類似的東西。 –

回答

1

看着這個代碼,似乎只要圖像是一樣的,因爲它爲4秒前,將重新進入循環,你可以重命名WaitTillDone到WaitTillScreenShotDifferentIn4SecountSnapshots

因此,如果例如你進入你的循環,所有的更改已經完成後,你將永遠不會退出它。

我認爲這裏發生的事情是,在四分之一的情況下,Excel對您而言太快,並且在您進入循環之前完成更改。

例如,如果您最初的形象是Y,而你在時間0輸入您do循環:

這將是永遠循環下去,直到截圖再次改變:

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

謝謝!我不相信我犯了這樣一個愚蠢的錯誤。我只是改變了!!跑步,它完美的作品。感謝您發現我的錯誤。 –