# string = string + AndererString



## The_S (3. Apr 2005)

Hi, hab ne Schleife, die etwas ausliest. Dieses Etwas wird dann immer wieder zu einem String hinzugefügt


```
while (!fertigAusgelesen) {
    str = str + ausgelesenes;
}
```

Nur desto mehr ich auslese, desto langsamer wird es mit der Zeit! Weiß jemand wie ich das beschleunigen kann?


----------



## Illuvatar (3. Apr 2005)

Suche


----------



## The_S (3. Apr 2005)

Nach was?


----------



## Beni (3. Apr 2005)

string + performace

Der 9. Eintrag ist bereits was brauchbares.


----------



## The_S (3. Apr 2005)

Danke! Jetzt läufts wunderbar schnell. Jetzt kann mein Programm ohne eine ewige Wartezeit mehr Text verarbeiten. Leider! Denn ich muss das Ergebnis der Schleife in ein JTextArea ausgeben. Und da dauert das dann wieder ewig, weil ich dann wohl oder übel einen String brauche. Gibts dafür vielleicht eine schnellere Möglichkeit als


```
textarea.setText(stringbuffer.toString());
```

Weil so macht es den Anschein als wäre mein Programm abgestürzt  :cry: , da meine JProgressBar sofort auf 100% springt, weil dass verarbeiten so schnell geht, das Programm aber dann noch ewig braucht, bis es die Ausgabe anzeigen kann.


----------



## Wildcard (3. Apr 2005)

Kann mir irgendwie nicht vorstellen das das so ewig dauert...
Wie lang ist der String?


----------



## The_S (3. Apr 2005)

Hab das jetzt gelöst indem ich ab und an mal per append zum TextArea hinzufüge und dadurch nicht alles auf einmal kommt. Jetzt hab ich aber noch ein letztes Problem  :wink:  . Das Programm und der PC allgemein sind verdammt langsam, nachdem ich den String in das JTextArea ausgegeben habe. Hab nen extra Thread gemacht, kann es sein, dass der noch bis zur Unendlichkeit weiterläuft?


----------



## The_S (3. Apr 2005)

Wildcard hat gesagt.:
			
		

> Kann mir irgendwie nicht vorstellen das das so ewig dauert...
> Wie lang ist der String?



Unterschiedlich! Aber kann sehr lang sein! Mein Test-String ist 20058 Zeichen lang


----------



## Wildcard (3. Apr 2005)

> Unterschiedlich! Aber kann sehr lang sein! Mein Test-String ist 20058 Zeichen lang


Du machst da IMO was verkehrt! Ich hab's gerade mit 10x so vielen Zeichen versucht, und das hat max. 0.5s gedauert.
Zeig mal code her...


----------



## The_S (4. Apr 2005)

```
void konvert() { 
      
      new Thread(new Runnable() { 
         public void run() { 
            changeAusgabe(); 
            char[] original = eingabe.getText().toCharArray(); 
            char[] netnem = auslassen.toCharArray(); 
            ausgabe.setText(""); 
            sz = new StringBuffer(); 
            fortschritt.setMaximum(original.length - 1); 
            for (int a = 0; a < original.length; a++) { 
              soweit = a; 
              performance++; 
               SwingUtilities.invokeLater( new Runnable() { 
                  public void run() { 
                     fortschritt.setValue(soweit); 
                  } 
               } ); 
               for (int b = 0; b < netnem.length; b++) { 
                    if (original[a] == netnem[b]) { 
                     next = true; 
                  } 
               } 
               if (next == false) { 
                  if ((lesbar == true) && (nix == 4)) { 
                        if ((int)original[a] >= 100) { 
                           sz.append("0"); 
                        } 
                        else if (((int)original[a] >= 10) && ((int)original[a] < 100)) { 
                           sz.append("00"); 
                        } 
                        else { 
                           sz.append("000"); 
                        } 
                        sz.append((int)original[a]); 
                  } 
                  else if ((lesbar == true) && (nix == 3)) { 
                        if (((int)original[a] >= 10) && ((int)original[a] < 100)) { 
                             sz.append("0"); 
                        } 
                        else if ((int)original[a] < 10) { 
                           sz.append("00"); 
                        } 
                        sz.append((int)original[a]); 
                  } 
                  else if ((lesbar == true) && (nix == 0)) { 
                        sz.append((int)original[a] + Trennzeichen); 
                  } 
                  else if (lesbar == false) { 
                        sz.append((int)original[a]); 
                  } 
               } 
               else { 
                  if (nix == 0) { 
                          sz.append(original[a] + Trennzeichen); 
                 } 
                 else { 
                       sz.append(original[a]); 
                 } 
                  next = false; 
               } 
               if (performance >= original.length / 50) { // Das hier ist dafür da, dass das Textfeld
                  ausgabe.append(sz.toString()); // regelmäßig aktualisiert wird
                  sz = new StringBuffer(); // damit nicht alles auf einmal reingeschrieben werden
                  performance = 0; // muss, was bei mir ja sehr lange dauert
               } 
            } 
            ausgabe.append(sz.toString()); 
         } 
      } ).start(); 
   }
```

Hier mal die Methode. Sie konvertiert einen Text in ASCII-Code. Und das entweder in normalen ASCII oder eindeutigen (mit nem Trennzeichen oder aufgefüllt mir Nullen, ...)


----------



## The_S (4. Apr 2005)

Sorry, muss mich korrigieren! Andere Anwendungen sind nicht langsam! Einzig mein Programm lahmt. Vor allem wenn ich dann meine ganz Ausgabe mit "STRG + a" markieren will, bekomme ich eine CPU auslastung von 100% und das Ewig! Wenn ich nur einen kleinen Teil (vielleicht 200 Zeichen) markiere, dann hab ich auch eine CPU Auslastung von 100% für ein paar Sekunden. Sogar das einfache Scrollen durch den Text hackt und ruckelt. Ganz zu schweigen davon, wenn ich ein Zeichen löschen will.


----------



## Wildcard (4. Apr 2005)

Wenn schon das scrollen bei dir ruckelt, liegts vermutlich nicht am text, sondern dann machst du Unfug mit Threads!
Zeig mal dazu was her...


----------



## The_S (4. Apr 2005)

Was willst'n? Das ist der einzige zusätzliche Thread! Der User gibt (oder läd) nen Text, drückt auf nen Button, die oben gezeigte Methode wird ausgeführt und schon hab ich den Salat.


----------



## The_S (4. Apr 2005)

Kann es sein, dass JTextArea Probleme bei extrem langen Texten bekommt?


----------



## The_S (4. Apr 2005)

Ich weiß woran es liegt! Nur nicht wie ich es behebe! Ich hab LineWrap in meinem JTextArea! Wenn ich das ausschalte, gehts einwandfrei (Sieht aber dementsprechend scheiße aus). Schalte ich es wieder ein, hab ich mein Problem wieder.


----------



## dotlens (4. Apr 2005)

du setzt in einem Thread den Text von GUI Komponenten, Swing ist aber nicht Threadsicher.
versuchs mal ohne Threads. und dann wenns richtig läuft kannst du falls nötig immer noch dein JProgressBar einbauen.


----------



## The_S (4. Apr 2005)

Danke für den Tipp! Ich probier es aus. Aber ich glaube nicht, dass es daran liegt, da ich es mit einem anderen JTextArea ohne Thread mit LineWrap(true) getestet hab und da ist das selbe Problem aufgetreten.


----------



## Wildcard (4. Apr 2005)

Hobbit hat gesagt.:
			
		

> Danke für den Tipp! Ich probier es aus. Aber ich glaube nicht, dass es daran liegt, da ich es mit einem anderen JTextArea ohne Thread mit LineWrap(true) getestet hab und da ist das selbe Problem aufgetreten.


Versuch mal die Zeilenumbrüche selbst hinzuzufügen wenn du den text einliest und mach dann das lineWrapping aus. Vieleicht ist's dann schneller...


----------



## The_S (4. Apr 2005)

Kann ich nicht! Weil ich dann zusätzliche Zeichen in meinem Text hätte (\n), die das Ergebnis verfälschen würden. Hab eine *vorrübergehende* Möglichkeit gefunden. Hab einfach die Aktivierung eines Performance-Modus ermöglicht. Die soll bei großen Texten aktiviert werden und schreibt dann halt unübersichtlich aber mit dem selben Ergebnis, nachdem das Ergebnis in den meisten Fällen danach sowieso kopiert oder gespeichert wird. Ist nicht ganz schön aber für den Übergang ... heißt aber nicht dass mein Problem gelöst ist :wink:


----------



## Wildcard (5. Apr 2005)

Ich frag mich ja schon wo man einen 20000 Zeichen String ohne Zeilenumbrüche herkriegt, aber naja...
Hab mal eine JTextPane genommen und 50000 Zeichen (ohne umbrüche) eingefügt. Alles auf einmal setzen dauert ca. 2-3s und danach kann man ganz normal mit arbeiten. 
Überhaupt kein Problem!  :wink:


----------



## The_S (5. Apr 2005)

Wildcard hat gesagt.:
			
		

> Ich frag mich ja schon wo man einen 20000 Zeichen String ohne Zeilenumbrüche herkriegt, aber naja...



Indem man einen anderen String in ASCII-Zeichencode formatiert!? Da ist sogar noch viel mehr drin, weshalb ich an dieser Stelle gerne auf einen anderen Thread von mir verlinken möchte, da ich jetzt mit den rießigen StringBuffer Probleme bekomme  :wink:  :bae:

http://www.java-forum.org/de/viewtopic.php?t=16199&highlight=


----------



## Wildcard (5. Apr 2005)

Wie oben geschrieben versuch mal eine TextPane. 50000 Zeichen auf einmal waren kein Problem.


----------

