uburoi
Lt. Commander
- Registriert
- Aug. 2008
- Beiträge
- 1.306
Hallo zusammen!
Ich habe mir zu Übungs- und Anschauungszwecken ein kleines Java-Programm geschrieben, das mir anhand einer IP-Adresse und Subnetzmaske einige Daten anzeigt (s. Screenshot). Nach Fertigstellung fiel mir auf, dass das Programm zwar lief, aber die CPU-Auslastung auf 100% hochtrieb, was bei so einem Progrämmchen ja eigentlich nicht sein darf. Ich konnte das Problem zwar eingrenzen und umgehen, aber ich verstehe es nicht und wäre für Rat dankbar.
Zur Erläuterung:
Das Ausgabefenster ist eine Canvas (meine GUI-Klasse hat eine private innere Klasse, die eine Unterklasse von JComponent ist), die sich die relevanten Werte von einem IPDaten-Objekt holt und in der paint()-Methode zeichnet. Beim Button-Klick wird das IPDaten-Objekt aktualisiert und die repaint()-Methode der Canvas-Klasse aufgerufen.
Die paint()-Methode sah zunächst so aus:
Ich konnte schließlich eingrenzen, dass der setFont()-Aufruf für die CPU-Last verantwortlich ist. Ich habe die Fonts dann als Instanzvariablen festgelegt und den Code dahingehend geändert:
Leider war das Problem damit immer noch nicht behoben. Erst als ich den zweiten setFont()-Aufruf aus der Methode entfernt bzw. auskommentiert habe, sank die CPU-Last auf einen vernachlässigbaren Wert. (Wenn ich übrigens im ersten setFont()-Aufruf die Variable durch ein neues Font-Objekt ersetze wie im ersten Code-Beispiel, geht die CPU-Last auch wieder nach oben.) So klappt es also, allerdings dann mit nur einer einzigen Schrift:
Ich bin hier tatsächlich ratlos…
Gruß Jens
PS: Aus mir unbekannten Gründen ist das Java-Präfix vor dem Titel verschwunden, und ich kann es auch nicht nachträglich hinzufügen. Entschuldigt das bitte!
Ich habe mir zu Übungs- und Anschauungszwecken ein kleines Java-Programm geschrieben, das mir anhand einer IP-Adresse und Subnetzmaske einige Daten anzeigt (s. Screenshot). Nach Fertigstellung fiel mir auf, dass das Programm zwar lief, aber die CPU-Auslastung auf 100% hochtrieb, was bei so einem Progrämmchen ja eigentlich nicht sein darf. Ich konnte das Problem zwar eingrenzen und umgehen, aber ich verstehe es nicht und wäre für Rat dankbar.
Zur Erläuterung:
Das Ausgabefenster ist eine Canvas (meine GUI-Klasse hat eine private innere Klasse, die eine Unterklasse von JComponent ist), die sich die relevanten Werte von einem IPDaten-Objekt holt und in der paint()-Methode zeichnet. Beim Button-Klick wird das IPDaten-Objekt aktualisiert und die repaint()-Methode der Canvas-Klasse aufgerufen.
Die paint()-Methode sah zunächst so aus:
Java:
public void paint(Graphics g) {
setFont(new Font(Font.MONOSPACED, Font.BOLD, 11));
g.setColor(Color.BLACK);
g.drawString("IP-ADRESSE:", 10, 20);
// noch ein paar Strings
setFont(new Font(Font.MONOSPACED, Font.PLAIN, 11));
g.setColor(Color.BLUE);
g.drawString(daten.gibIP(), 400, 20);
// noch ein paar andere Strings
}
Ich konnte schließlich eingrenzen, dass der setFont()-Aufruf für die CPU-Last verantwortlich ist. Ich habe die Fonts dann als Instanzvariablen festgelegt und den Code dahingehend geändert:
Java:
public void paint(Graphics g) {
setFont(mb); // im Konstruktor als Fettschrift festgelegt
g.setColor(Color.BLACK);
g.drawString("IP-ADRESSE:", 10, 20);
// noch ein paar Strings
setFont(m); // im Konstruktor als Normalschrift festgelegt
g.setColor(Color.BLUE);
g.drawString(daten.gibIP(), 400, 20);
// noch ein paar andere Strings
}
Leider war das Problem damit immer noch nicht behoben. Erst als ich den zweiten setFont()-Aufruf aus der Methode entfernt bzw. auskommentiert habe, sank die CPU-Last auf einen vernachlässigbaren Wert. (Wenn ich übrigens im ersten setFont()-Aufruf die Variable durch ein neues Font-Objekt ersetze wie im ersten Code-Beispiel, geht die CPU-Last auch wieder nach oben.) So klappt es also, allerdings dann mit nur einer einzigen Schrift:
Java:
public void paint(Graphics g) {
setFont(m);
g.setColor(Color.BLACK);
g.drawString("IP-ADRESSE:", 10, 20);
// noch ein paar Strings
g.setColor(Color.BLUE);
g.drawString(daten.gibIP(), 400, 20);
// noch ein paar andere Strings
}
Ich bin hier tatsächlich ratlos…
Gruß Jens
PS: Aus mir unbekannten Gründen ist das Java-Präfix vor dem Titel verschwunden, und ich kann es auch nicht nachträglich hinzufügen. Entschuldigt das bitte!