Hallo,
ich habe hier ein Programm das die Farbtiefe in Bilder auf einen eingebenen Wert reduziert. Der Wert wird als parameter beim Programmstart übergeben oder mittels GUI ausgewähtl, ebenso Quelldatei, Zieldatei etc und die Anzahl der Threads mit denen das Programm ausgeführt.
Das Problem ist allerdings, dass das Programm immer langsamer wird je mehr Threads ich angebe (habe 4 CPU Kerne). Ich verwende nur einmal join(), sonst nie etwas in der Art, und das habe ich auch schon weggelassen, hat nichts an der Ausführungszeit geändert. Wie kann das sein?
Hier der Code des Threads :
Vielleicht hat ja einer eine Idee, ich bin mit meinem Latein am Ende.
ich habe hier ein Programm das die Farbtiefe in Bilder auf einen eingebenen Wert reduziert. Der Wert wird als parameter beim Programmstart übergeben oder mittels GUI ausgewähtl, ebenso Quelldatei, Zieldatei etc und die Anzahl der Threads mit denen das Programm ausgeführt.
Das Problem ist allerdings, dass das Programm immer langsamer wird je mehr Threads ich angebe (habe 4 CPU Kerne). Ich verwende nur einmal join(), sonst nie etwas in der Art, und das habe ich auch schon weggelassen, hat nichts an der Ausführungszeit geändert. Wie kann das sein?
Hier der Code des Threads :
Java:
private class MyThread extends Thread implements Runnable{
int[] zielfarbraum;
int[] fehler;
int alterFarbwert;
int neuerFarbwert;
int threadNummer;
int anzahlThreads;
public MyThread (int threadNummer, int[] zielfarbraum, int[] fehler, int anzahlThreads) {
this.fehler = fehler;
this.zielfarbraum = zielfarbraum;
this.anzahlThreads = anzahlThreads;
this.threadNummer = threadNummer;
}
public void run() {
for (int y = threadNummer * (bild.getHeight()/anzahlThreads); y < Math.min(((bild.getHeight()/
anzahlThreads) * (threadNummer + 1)), bild.getHeight()) ; ++y
/*int y = threadNummer; y < bild.getHeight(); y += anzahlThreads*/) {
for (int x = 0; x < bild.getWidth(); ++x) {
alterFarbwert = bild.getRGB(x, y);
neuerFarbwert = holeNaechsteFarbe(alterFarbwert, zielfarbraum);
bild.setRGB(x, y, neuerFarbwert);
fehler = berechneFehler(alterFarbwert, neuerFarbwert);
wendeFehlerAn(x + 1, y, fehler, 7);
wendeFehlerAn(x - 1, y + 1, fehler, 3);
wendeFehlerAn(x, y + 1, fehler, 5);
wendeFehlerAn(x + 1, y + 1, fehler, 1);
}
}
}
}
Vielleicht hat ja einer eine Idee, ich bin mit meinem Latein am Ende.