CPU-Last durch Canvas

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:
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!

Bildschirmfoto 4.png
 
  • Gefällt mir
Reaktionen: Heinrich Harrer
Wie sieht denn deine setFont() aus? Ich hätte erwartet dass du den Aufruf g.setFont(m) benutzt.
 
  • Gefällt mir
Reaktionen: uburoi
Hooo schrieb:
Ich hätte erwartet dass du den Aufruf g.setFont(m) benutzt.
Oh, ich Esel! Du hast recht!
Die paint()-Methode ist ziemlich lang, weil alles Mögliche in die Canvas geschrieben wird. Da habe ich glatt übersehen, dass das "g." fehlt. Offenbar wird die setFont()-Methode dann nicht auf das Graphics-Objekt, sondern auf die Canvas-Instanz selbst angewendet, was dann zu Problemen führt (offenbar aber trotzdem mit Einschränkungen funktioniert).

Danke für den Hinweis – manchmal sieht man den Wald vor lauter Bäumen nicht…

Gruß Jens
 
Zurück
Oben