Habe eine neue Konponente geschrieben mit der ich alles von Sytem.ERR und System.OUT loggen möchte.
es funktioniert zwar nur leider bleibt die CPU-Zeit bei >97% wenn erstmalig in die JTextPane geloogt wird.
Es muss an den PipedStreams liegen nur leider weiß ich nicht wo. Bin wohl betriebsblind.
Kann sich vileicht einer mal meine LoggerRunnable ansehen oder die Komponente mal testen ob das Problem auch auftritt, dass der Thread nach dem ersten Loggen auf >97% CPU-Zeit bleibt.
Danke im Vorraus
es funktioniert zwar nur leider bleibt die CPU-Zeit bei >97% wenn erstmalig in die JTextPane geloogt wird.
Es muss an den PipedStreams liegen nur leider weiß ich nicht wo. Bin wohl betriebsblind.
Kann sich vileicht einer mal meine LoggerRunnable ansehen oder die Komponente mal testen ob das Problem auch auftritt, dass der Thread nach dem ersten Loggen auf >97% CPU-Zeit bleibt.
Danke im Vorraus
Code:
import java.awt.Color;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class Konsole extends JScrollPane {
private static final long serialVersionUID = 3664915929116677102L;
private final String fehler ="Ausnahmefehler in der Konsole: ";
private JTextPane textfeld;
private StyledDocument dokument;
private SimpleAttributeSet out;
private SimpleAttributeSet err;
private PrintStream streamout;
private PipedInputStream pipedin;
private PipedOutputStream pipedout;
public Konsole() {
super();
setVisible(true);
textfeld = new JTextPane();
textfeld.setEditable(false);
getViewport().add(textfeld);
dokument = (StyledDocument) textfeld.getDocument();
err = new SimpleAttributeSet();
StyleConstants.setForeground(err, Color.red);
StyleConstants.setBold(err, true);
out = new SimpleAttributeSet();
StyleConstants.setForeground(out, Color.black);
StyleConstants.setBold(out, true);
try {
pipedin = new PipedInputStream();
pipedout = new PipedOutputStream(pipedin);
streamout = new PrintStream(pipedout);
System.setOut(streamout);
Thread thread =new Thread(new LoggerRunnable(pipedin,this));
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void printErr(String text){
schreibeMitAttribut(text, err);
}
public void printOut(String text){
schreibeMitAttribut(text, out);
}
public void printlnErr(String text){
schreibeMitAttribut(text + "\n" ,err);
}
public void printlnOut(String text){
schreibeMitAttribut(text + "\n" ,out);
}
public void schreibeMitAttribut(String text, SimpleAttributeSet set){
try {
dokument.insertString(dokument.getLength(), text , set);
new ScrollingThread(this).start();
} catch (BadLocationException e) {
textfeld.setText(textfeld.getText() + fehler + e.getMessage());
}
}
}
class ScrollingThread extends Thread {
private Konsole konsole;
public ScrollingThread(Konsole konsole) {
this.konsole=konsole;
}
public void run(){
synchronized(this){
konsole.getVerticalScrollBar().setValue(konsole.getVerticalScrollBar().getMaximum());
}
}
}
import java.io.IOException;
import java.io.PipedInputStream;;
public class LoggerRunnable implements Runnable {
private byte[] buffer = new byte[1024];
private PipedInputStream pipedin;
private Konsole konsole;
public LoggerRunnable(PipedInputStream pipedin, Konsole konsole) {
this.pipedin=pipedin;
this.konsole=konsole;
}
public void run() {
int len;
while(true){
try {
len = pipedin.read(buffer);
if(len==-1){
//? Vieleicht hier der Fehler
break;
}
konsole.printlnOut(new String(buffer,0,len));
} catch (IOException e) {
//Fehler
}
}
}
}