職場で特定の機能を自動化するプログラムを作成しましたが、問題が発生しないようにダミーで証明しようとしていますが、発生してはならないエラーが発生しました。
基本的に、私のメソッドが行っていることは、スプレッドシートへのデータの入力と自動フォーマットが停止するまで待機することで、それを使って他のことを行うことができます。この方法で行う必要があるのは、スクリーン ショットを撮り、待機し、別のスクリーン ショットを撮り、それらが同じ場合は続行し、そうでない場合はもう少し待つことだけです。
ここに方法があります。
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);
ご協力ありがとうございました。