Langsame Gui

Status
Nicht offen für weitere Antworten.

CK

Aktives Mitglied
Hallo,
ich schreibe zur Zeit eine kleine Swing Anwendung mit einem JFrame.
Dieses Frame beinhaltet eine JTabPane mit 5 Tabs. Jedes Tab enthält zwei JTextAreas.

Dann erzeuge ich mehrere sehr rechenaufwendige Threads die alle in die verscheidenen
JTextAreas hineinschreiben.
Die Methode die die Strings zum schreiben entgegen nimmt sieht etwa so aus und befindet sich direkt im
JFrame.


Code:
private void writeText(final String txtToAppendm, final int tabnumber, final boolean append)
            throws Exception {
        
        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                mItemSaveLog.setEnabled(true);

                if (tabnumber >= txtCenter.length)
                    try {
                        throw new Exception("Tab not found!");
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                if (append) {
                    txtCenter[tabnumber].append("\n" + txtToAppendm);

                    if (txtToAppendm.indexOf("BlaBla") != -1)
                        txtSouth[tabnumber].append("\n" + txtToAppendm);

                } else {
                    txtCenter[tabnumber].setText(txtToAppendm);

                    if (txtToAppendm.indexOf("BlaBla") != -1
                            || txtToAppendm.equals(""))
                        txtSouth[tabnumber].setText(txtToAppendm);

                }
                scrollAllToEnd();
            }
          });
 
  
   
    }

Jetzt zu meinen Problem:
Die Oberfläche lässt sich, sobald die Threads gestartet sind nur sehr langsam bedienen und hängt sich auch gelegentlich mal komplett auf. Es sind zwar viele Threads aber hiervon werden nur max. 5 gleichtzeitig ausgeführt.
Das sieht etwa so aus:
Code:
 for (int i = 0; i < files.length; i++) {
                    threadExecutor.execute(new AufwendigerThread(files[i],
                            tabnumber));
                    tabnumber++;

                    if (tabnumber >= txtCenter.length)
                        tabnumber = 0;
                }
                threadExecutor.shutdown();

Jetzt meine Frage. Wie bekomme ich das hin das die Oberfläche sich flüssig bedienen lässt trotz das diese 5 Threads unterschiedlich in die Gui schreiben?

Danke schonmal für euere Hilfe.
 

CK

Aktives Mitglied
Bin ja schonmal nen bissel weiter. Das schreiben selbst ist nicht das Problem, sondern das die Threads so viel Leitung fressen und somit nix mehr für die Gui übrig bleibt.
Weis aber leider immer noch nicht wie ich das Problem löse.
Hilfe!!
 
S

SlaterB

Gast
aus der ferne zu beurteilen was irgendwelche Threads bei dir an Leistung belegen, von denen man allein die Infos

AufwendigerThread + 'gibt irgendwann mal einen oder mehrere kurze oder lange Texte an eine TextArea'

hat, ist ziemlich schwierig..,
baue vielleicht an geeigneten Stellen Thread.sleep(100); ein
 

CK

Aktives Mitglied
Grob gesagt macht jeder Thread mehrer FileOperationen auf einen DOM-Baum. Sleeps sind zahlreiche eingebaut und die Priorität ist auf Minimum.
 
G

Gast

Gast
Eingefrorene GUI folgt oftmals aus einem Missbrauch des EventDispatchingThreads.

Um dem Vorzubeugen:

Verwende einen Swingworker (Java 6) oder Swingworker (dev Java net oder so ähnlich für Frühere Java Versionen).
 
T

tuxedo

Gast
Sowas hat er doch schon im Einsatz?!

-->

Code:
SwingUtilities.invokeLater(new Runnable() {

siehe ertser Post ..

- Alex
 
G

Guest

Gast
alex0801 hat gesagt.:
Sowas hat er doch schon im Einsatz?!

-->

Code:
SwingUtilities.invokeLater(new Runnable() {

siehe ertser Post ..

- Alex

Eben nicht.

Zumindest hat das
Code:
SwingUtilities.invokeLater(new Runnable() {
nichts mit dem SwingWorker zu tun. So, oder so ähnlich sollte jede Swing-Applikation gestartet werden.

Ich würde dir, sofern es dich interessiert, mal diesen Artikel nahelegen.

http://java.sun.com/developer/technicalArticles/javase/swingworker/

Da findest du eine bessere Erklärung, als ich sie jemals liefern könnte.

beste Grüße
 
T

tuxedo

Gast
Dass SwingUtilities != SwingWorker ist ist klar. Aber haben nicht beide das gleiche Ziel? Nämlich den EDT nicht auszubremsen?

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben