Hi Leute,
ich brauche dringend Hilfe von ein paar Experten die mir mit meinem Halbwissen unter die Arme greifen.
Ich möchte eine Methode schreiben die permanent Screenshots macht (Sie soll ca. 4 Screenshots (45x45 pixel) parallel machen) und die Screenshots dann in Dateien schreibt und diese Dateien dann mit anderen Dateien (die schon vorliegen auf Gleichheit vergleicht. Ich benutze dazu die Robot Klasse und nutze robot.screencapture und ImageIO.write/read um den screenshot zu machen und in eine Datei zu schreiben und dann die Pixel auslesen.
Soweit so gut, das ganze klappt auch wunderbar solange ich die Methode einmal durchlaufen lasse. Nur wenn ich das jetzt permanent machen lassen möchte gibts Probleme, erst ist das Programm so nach ca. 1 Minute abgestürzt mit der Meldung FileNotFound exception (Zugriff verweigert). der Screenshot wurde plötzlich nicht mehr gemacht oder screateScreencapture ist nicht mehr mitgekommen oder irgendwelche Buffer waren voll, ich weiß es nicht. Mittlerweile läuft es nach einigen Modifikationen ohne diesen Fehler, dafür frisst sich das Programm mit Speicher voll und so nach 15 Minuten bekomme ich die Meldung das der Java Heap Space voll ist, ich habe keine Ahnung wie ich das löse. Ich weiß z.B. nicht ob da immer zusätzlich Speicher verbraucht wird wenn ich File x = new File oder so mache, ich hab versucht so viel wie möglich auszulagern aber klappt alles nicht. Also wenn jemand weiß wie ich das ganze stabil hinbekomme und mir erklärt wie ImageIO usw. genau arbeitet wäre cool.
Hier bekommt ihr jetzt noch den Code, das ganze überprüft jetzt ob ein Screenshot mit einer aus 6 vorgegebenen Dateien übereinstimmt, und das ganze muss ich ja mindestens 4 mal haben. Es darf also nicht abstürzen, muss dennoch recht zügig arbeiten und der Speicher sollte sich nicht so zufressen.
Ihr seht im Code sowas wie xx.flush(); und sowas, ich weiß allerdings nicht ob das überhaupt irgendwas bringt, habs irgendwo aufgeschnappt, also bitte ich um Experten die mich aufklären können.
Auch Sachen wie while (!tempshot.canread()) {this.sleep (10);} da weiß ich nicht obs irgendeinen sinn hat...
Danke im voraus, Gruß Dominik
ich brauche dringend Hilfe von ein paar Experten die mir mit meinem Halbwissen unter die Arme greifen.
Ich möchte eine Methode schreiben die permanent Screenshots macht (Sie soll ca. 4 Screenshots (45x45 pixel) parallel machen) und die Screenshots dann in Dateien schreibt und diese Dateien dann mit anderen Dateien (die schon vorliegen auf Gleichheit vergleicht. Ich benutze dazu die Robot Klasse und nutze robot.screencapture und ImageIO.write/read um den screenshot zu machen und in eine Datei zu schreiben und dann die Pixel auslesen.
Soweit so gut, das ganze klappt auch wunderbar solange ich die Methode einmal durchlaufen lasse. Nur wenn ich das jetzt permanent machen lassen möchte gibts Probleme, erst ist das Programm so nach ca. 1 Minute abgestürzt mit der Meldung FileNotFound exception (Zugriff verweigert). der Screenshot wurde plötzlich nicht mehr gemacht oder screateScreencapture ist nicht mehr mitgekommen oder irgendwelche Buffer waren voll, ich weiß es nicht. Mittlerweile läuft es nach einigen Modifikationen ohne diesen Fehler, dafür frisst sich das Programm mit Speicher voll und so nach 15 Minuten bekomme ich die Meldung das der Java Heap Space voll ist, ich habe keine Ahnung wie ich das löse. Ich weiß z.B. nicht ob da immer zusätzlich Speicher verbraucht wird wenn ich File x = new File oder so mache, ich hab versucht so viel wie möglich auszulagern aber klappt alles nicht. Also wenn jemand weiß wie ich das ganze stabil hinbekomme und mir erklärt wie ImageIO usw. genau arbeitet wäre cool.
Hier bekommt ihr jetzt noch den Code, das ganze überprüft jetzt ob ein Screenshot mit einer aus 6 vorgegebenen Dateien übereinstimmt, und das ganze muss ich ja mindestens 4 mal haben. Es darf also nicht abstürzen, muss dennoch recht zügig arbeiten und der Speicher sollte sich nicht so zufressen.
Ihr seht im Code sowas wie xx.flush(); und sowas, ich weiß allerdings nicht ob das überhaupt irgendwas bringt, habs irgendwo aufgeschnappt, also bitte ich um Experten die mich aufklären können.
Auch Sachen wie while (!tempshot.canread()) {this.sleep (10);} da weiß ich nicht obs irgendeinen sinn hat...
Danke im voraus, Gruß Dominik
Code:
public class Scanne extends Thread{
public static int Zaehler = 1;
public String[] FileNamesL1 = {"w1_1","w1_2","w1_3","w1_4","w1_5","w1_6"};
public static int Welcher = 0;
public boolean musswarten = false;
Robot superhirn = new Robot();
File tempshot = new File("tempshot.gif");
Rectangle maßeL1 = new Rectangle(465,416,43,46);
/** Creates a new instance of Scanne*/
public Scanne() throws IOException, AWTException {
ImageIO.write(superhirn.createScreenCapture(maßeL1), "gif", tempshot);
}
public void ScanningL1() throws IOException, InterruptedException {
ImageIO.setUseCache(false);
File extern = new File ("extern.gif");
File datei = new File( FileNamesL1[Welcher] );
while (!datei.canRead()) {this.sleep(5);}
Image image2 = ImageIO.read(datei);
BufferedImage imagex = (BufferedImage) image2;
if (tempshot.canWrite() && tempshot.canExecute()) {if (Welcher == 0) {ImageIO.write(superhirn.createScreenCapture(maßeL1), "gif", tempshot);}}
if (!tempshot.canWrite() || !tempshot.canExecute()) {
tempshot.delete();
this.sleep(10);
tempshot.renameTo(extern);
File tempshot = new File("tempshot.gif");
ImageIO.write(superhirn.createScreenCapture(maßeL1), "gif", tempshot);
}
while (!tempshot.canRead()) {this.sleep(10);}
Image tempimage = ImageIO.read(tempshot);
BufferedImage tempimagex = (BufferedImage) tempimage;
tempimage.flush();
tempimagex.flush();
int pixelarray[][] = new int[tempimagex.getWidth()][tempimagex.getHeight()];
int pixelarray2[][] = new int[imagex.getWidth()][imagex.getHeight()];
boolean gleich = true;
// if (imagex.hashCode() != tempimagex.hashCode()) {gleich = false;}
for (int i =0;i < tempimagex.getWidth();i++) {
for (int j = 0;j < tempimagex.getHeight();j++) {
pixelarray[i][j] = tempimagex.getRGB(i,j);
pixelarray2[i][j] = imagex.getRGB(i,j);
System.out.println("Farbwert an Position "+i+", "+j+" = "+pixelarray[i][j]);
if (pixelarray[i][j] != pixelarray2[i][j]) {gleich = false;break;}
}if (!gleich) {break;}
}
if (gleich && (musswarten==false)) {
System.out.println("Erkannt");WriteTXTL1(Welcher);musswarten = true;}
if (!gleich) {Welcher = (WelcherWuerfel + 1) %6;}
if (!gleich && (Welcher == 5)) {musswarten = false;}
tempimage.flush();
tempimagex.flush();
tempshot.delete();
this.sleep(100);
this.ScanningL1();
}