Hallo,
ich habe neulich angefangen ein Programm zu schreiben, welches Fraktale zeichnet. Momentan habe ich mich nur mit der Mandelbrotmenge beschäftigt und wie sich schon früh herausstellte braucht mein Programm relativ lange das Fraktal zu berechnen. Also habe ich die Rechenarbeit auf mehrere Threads aufgeteilt, sodass nun von einem Thread nur ein kleiner Teil meines Frames berechnet wird. Das funktioniert auch alles ganz gut, nur leider wird werden die Threads nicht auf verschiedene Kerne meines Prozessors ausgelagert, weshalb mein Programm immer noch genau so langsam ist wie vorher... (Der Task-Manager zeigt an, dass nur der 1. Kern mit fast 100% ausgelastet ist, die anderen nicht)
Gibt es da vielleicht Probleme, weil mehrere Threads auf einen Frame zeichnen wollen bzw. muss ich eine andere Art Thread benutzen, wenn ich sie für solche GUI-Sachen anwenden möchte?
Die Main-Klasse:
Die Thread-Klasse mit der run-Mehtode:
ich habe neulich angefangen ein Programm zu schreiben, welches Fraktale zeichnet. Momentan habe ich mich nur mit der Mandelbrotmenge beschäftigt und wie sich schon früh herausstellte braucht mein Programm relativ lange das Fraktal zu berechnen. Also habe ich die Rechenarbeit auf mehrere Threads aufgeteilt, sodass nun von einem Thread nur ein kleiner Teil meines Frames berechnet wird. Das funktioniert auch alles ganz gut, nur leider wird werden die Threads nicht auf verschiedene Kerne meines Prozessors ausgelagert, weshalb mein Programm immer noch genau so langsam ist wie vorher... (Der Task-Manager zeigt an, dass nur der 1. Kern mit fast 100% ausgelastet ist, die anderen nicht)
Gibt es da vielleicht Probleme, weil mehrere Threads auf einen Frame zeichnen wollen bzw. muss ich eine andere Art Thread benutzen, wenn ich sie für solche GUI-Sachen anwenden möchte?
Die Main-Klasse:
Java:
package Fractals;
public class Main {
private static double sw = 1000.0;
private static double sh = 1000.0;
private static double squares = 27.0;
public static void main(String[] args) {
Frame frame = new Frame((int)(sw+16),(int)(sh+38));
for(int i = 0; i<squares; i++){
for(int j = 0; j<squares; j++){
MandelbrotThread mbt = new MandelbrotThread(sw/squares,sh/squares,frame,(double)i,(double)j,squares);
Thread x = new Thread(mbt);
x.start();
}
}
}
}
Die Thread-Klasse mit der run-Mehtode:
Java:
package Fractals;
public class MandelbrotThread extends Thread {
private double sw;
private double sh;
private double startX;
private double startY;
private double idX;
private double idY;
private double squares;
private Frame frame;
public MandelbrotThread(double screenwidth, double screenheight, Frame f, double i, double j, double s){
sw = screenwidth;
sh = screenheight;
frame = f;
idX = i;
idY = j;
squares = s;
startX = i*sw;
startY = (squares-1-j)*sh;
}
public void run( ) {
Paint paint = new Paint(sw,sh,idX,idY,squares);
paint.setBounds((int)startX,(int)startY,(int)(sw),(int)(sh));
paint.setVisible(true);
frame.add(paint);
frame.addMouseListener(new ML(paint,frame));
frame.addMouseMotionListener(new ML(paint,frame));
}
}