Fehler in ungeändertem Bereich

ulki

Erfahrenes Mitglied
Hi! :(

Ich weiß das der Text ziemlich lang ist, aber mein Problem ist etwas unübersichtlich und ich hoffe, dass eine ausführliche Beschreibung euch hilft mir zu helfen.
Wer schon Erfahrung mit Fehlern hat, die plötzlich (zur Laufzeit) in ungeänderten Bereichen (einer anderen Klasse) eines bis dahin lauffähigen Programms auftauchen, würde mir sehr helfen, wenn er sich die Mühe macht und die ausführlichere Beschreibung unten ließt.

Ich arbeite zusammen mit drei weiteren Leuten an einem etwas größerem Projekt. Wir arbeiten mit NetBeans 4.0 und CVS.
Unser Ziel ist es einen Browser zu schreiben, mit dem wir Daten von Componenten einer Serverfarm, bzw. sonstigen Anlagen die sich an den neuen Standart SMIS halten, anzeigen können. Das ganze ist für die Uni. Der ganze Code ist schon sehr umfangreich, deswegen kann ich ihn schlecht hier reinstellen.

Nun hat sich folgendes Problem ergeben:
Um die Ladezeiten etwas zu optimieren, und einen vernünftigen Statusbalken anzuzeigen hatte ich begonnen einen Thread zu schreiben und das schon laufende Programm darauf umzustellen. Die ersten Schritte waren auch recht erfolgversprechend. Doch plötzlich startete das Programm nicht mehr. Es meldete einen StakOverFlow und zwar an einer Stelle an der ich nicht das geringste geändert hatte. Und auch keiner der anderen hat dort etwas geändert, das habe ich gleich als erstes gefragt.

Nach mehreren Stunden des Einfügens von Testausgaben und studiums der API und des Tutorials war ich mir sicher, das zumindest syntaktisch bei mir nichts falsch war.

Ich habe dann einfach von vorne angefangen. Nun ist der Fehler wieder da.

Ich hatte alles Stück für Stück eingefügt und dann jedesmal getestet. Das letzte was ich eingefügt habe ist schon wieder raus. Aber es läuft immer noch nicht (nicht wieder).

Ich bin langsam am verzweifeln und wäre glücklich, wenn mir jemand sagen könnte ob es eine Möglichkeit gibt Fehler (laufzeit) in nicht geänderten Bereichen zu vermeiden.

Danke schonmal für die Mühe :rolleyes:
 
Zuletzt bearbeitet:
Moin,
ohne Codeschnippsel ist Fehlersuche natürlich schwierig. Ich kenne zum StackOverflow zwei Ursachen:
1. Der Thread bläht sich durch ständiges Erzeugen neuer Objekte auf, bis es zum Overflow kommt.
2. Es gibt irgendwo im Code eine Endlosschleife.
 
Naja wir haben 12 Klassen in der Steuerung..... Und 9 in der GUI.....
Mittlerweile habe ich aber das Fehlergebiet weiter einkreisen können.

Ich habe eine lauffähige Version unseres Programms ohne Threads. Nun habe ich für die Threads einige Klassen erstellt. Es scheint Probleme mit der Klasse Monitor zu geben. Zumindest taucht dieser Fehler immer auf, wenn ich die Variablendekleration von Monitor in unserem Hauptfenster einfüge.

Kurze Zusammenfassung der gewünschten Funktionalität: Im Hauptfenster wird eine Tabelle angeklickt, dadurch wird ein Thread gestartet in dem der Inhalt einer weitern Tabelle neu geladen werden soll, damit man ihn anzeigen kann.
Da es durchaus möglich ist, dass mehrere Tabellen gleichzeitig geladen werden existiert der Monitor (für synchronized Methoden).

Nun habe ich also meine laufende Version. Die Klassen für den Thread sind schon vorhanden. Ich starte das Programm und es läuft. Das MainWindow wird erzeugt, und das Fenster in das die gewünschte URL eingegeben wird erscheint.

Hier einmal die Variablendeklerationen und Konstruktoren von MainWindow:

Code:
import javax.swing.*;
import java.lang.*;
import de.fsc.smibrowser.*;         // there is only contact via interface but there are classes nedded
import javax.swing.tree.*;
import java.util.*;
import de.fsc.interfaces.*;
import javax.swing.table.*;
import java.awt.Cursor;

import de.fsc.smibrowser.Monitor;
import de.fsc.smibrowser.TableLoad;
import de.fsc.smibrowser.TableObject;

public class MainWindow extends javax.swing.JFrame implements ControlDataReceiver{
    
    private ConnectionDialog conBox;
    private GUIDataReceiver  receiver;
    private TreeNode         rootTreeNode;
    private Vector           lastInstanceTable;
    private String           url = "";          //initialising
    private NameSpace        selectedNameSpace;
    
    
   /** private Monitor          controlThreads = new Monitor();  //the one Monitor needed
    
    private TableLoad        instanceTableThread = new TableLoad();
    private TableLoad        propertyTableThread = new TableLoad();
    private TableLoad        poolTableThread     = new TableLoad();
    private TableLoad        portTableThread     = new TableLoad();
    private TableLoad        volumeTableThread   = new TableLoad(); */ 
    
    /** Creates new form MainWindow */
    public MainWindow(GUIDataReceiver rec) {
       System.out.println("hier ist der Konstruktor für MainWindow");
       System.out.println("GUIDataReceiver wird gesetzt");
        receiver = rec;
       System.out.println("GUIDataReceiver ist gesetzt"); 
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        
        catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.toString(), "Fehler", JOptionPane.ERROR_MESSAGE);
        }
        //controlThreads = new Monitor(this);
        initComponents();
        
       System.out.println("initComponents für MainWindow durchgelaufen"); 
       
        /** 
         showing the Connectiondialog
        */
       System.out.println("ConnectionDialog wird angezeigt");
        conBox = new ConnectionDialog(this, new javax.swing.JFrame(), true, receiver.getNameSpaces());
        conBox.setVisible(true);
       System.out.println("gleich wird der Knoten gesucht"); 
        rootTreeNode = receiver.getNode(); 
       System.out.println("Knoten wurde gesucht"); 
    }
    
    //public MainWindow(){ initComponents(); } ;

Wenn ich nun die auskommentierten Bereiche hinzuneheme geht nichts mehr und der genannte StakOverflowError erscheint an beliebigen Stellen während des Parsens der xml Datei.

Erklärung der Klassen:

ControlDataReceiver -- wie vieleicht ersichtlich ein Interface zur Kommunikation zwischen GUI und Steuerung

TableLoad -- Klasse des Threads

ConnectionDialog -- Klasse für das Anzeigen des Fensters in dem die URL eingegeben wird

TableObject --- Hält eine Identifiezierung und ein TableContent weil Threads ja nichts zurückgeben können

TableContent --- enthält mehrere Vectoren mit denen wir die darzustellenden Daten organisieren

Ich hoffe das hilft weiter
 
Zuletzt bearbeitet:
Hi!

Das Problem habe ich bis jetzt nicht lösen können. Ich will es jetzt von einer anderen Seite angehen und bitte nochmal um Mithilfe.
:)
In meiner GUI wird durch ein Event eine Anfrage ausgelöst, die an meine MainClass geht. Dort soll der Thread gestartet werden, der einen Statusbalken einblendet, der anzeigt das gearbeitet wird. Während der Statusbalken vor sich hin blinkt soll die Tabelle geladen werden (der Inhalt wird in einem Vector gespeichert). Wenn er damit fertig ist wird eine boolean Variable auf false gesetzt, alive=false; Dann soll in MainClass weiter gearbeitet werden. Nun weiß ich aber nicht, wie ich meine MainClass dazu bekomme auf den Thread zu warten.
MainClass selbst wird von einer weiteren Klasse gestartet und hat keine main Methode. Und das kann ich auch nicht ändern.
Es wäre klasse, wenn schnell jemand auf eine Lösung käme, oder mir einen Gedankenanstoß geben könnte. Den das ganze muss bis Freitag Nachmittag fertig sein und laufen.

tausend Dank für die Hilfe den ich sehe den Wald vor Bäumen nicht mehr :confused:
 
Was ist mit:

Code:
boolean alive;
deineEventMethode()
{
 alive = true;
 while (alive)
 {
  deinThreadDerAliveAufFalseSetzt();
 }
 mainClassObjekt.jetztDarfstDu();
}

?
 
Leider klappt es so nicht. Kann auch sein, das ich es irgendwie falsch verstanden habe.

Hier was ich geschrieben habe:

Aufruf aus meiner MainClass heraus:

Code:
public TableContent getInstanceTable(Enumeration classes){
    
    alive = true;  //Thread is living
    
    tableToBeLoad.setRepresentor("getInstanceTable"); //this is to be load
    
    content.clear();
    content.addElement(classes); //preparing the vector
    
    fetchingTable = new TableLoad(tableToBeLoad, content, cIMHandler, 1, this);
    
    while(alive)
    {
        fetchingTable.start();
    } 
    
    return tableToBeLoad.getContent();
}

tableToBeLoad ist ein Objekt einer selbstgeschriebenen Klasse hat einen Namen und eine Tabelle (Klasse TableContent ebenfalls von unserem Team selbst erstellt)

content ist ein Vector

und TableLoad der Thread.

Ich denke die while-Schleife ist der Auslöser. Den es gibt eine: "illigal State of Thread" Meldung.

Ach so hier noch ein Ausschnitt aus der Thread Klasse:

Code:
public void run() 
    {
      showing = new StatusBar(this);
      showing.setVisible(true);      //displaying a Statusbar
      
      switch(called) //the method calling is named above the case statment
      {
          //getInstanceTable
          case 1: {
              try
              {
               store = handler.createInstanceTable((Enumeration)what.get(0));
              }
              catch(Exception e)
              {
                String text=("Fehler Beim Verbinden zum CIMOM "+e.getMessage());
                JOptionPane.showMessageDialog(null, text, "Fehler beim Erstellen der Verbindung", JOptionPane.ERROR_MESSAGE);
                Vector one = new Vector();
                Vector two = new Vector();
                store = new TableContent(one, two, "");
              }
          }

      //es gibt noch 17 weitere case......
       }

      who.setContent(store);         //who ist das übergebene TableObject
      
      showing.setVisible(false);
      showing.dispose();             //eliminating the statuswindow
      
      mother.setAlive(false);        //the thread has done everything he was meant to
    }

Das Fenster mit dem Statusbalken und die Fehlermeldung tauchen fast gleichzeitig auf. Ich denke der Thread wird einfach mehreremale gestartet. Nur habe ich keine Idee wie ich das verhindern kann.
Ich werde nochmal nach Tutorials suchen, vieleicht habe ich da ja noch was übersehen....
Für mehr hilfe wäre ich aber immer dankbar, schließlich ist meine Zeit begrenzt ;)

ulki
 
Hallo!

Nur zur Info, man kann einen Thread nur einmal starten... ;)
(Nur für den Fall, dass du mit fetchingTable.start(); einen neuen Thread startest...)

Gruß Tom
 
Ich starte in dem Stück MainClass das oben zu sehen ist den Thread. Genau einmal.
Gut dann ist es das also nicht, aber wie kommt es dann zu dieser Fehlermeldung?
Da muss ich wirklich mal suchen gehen.....

illigal state of thread. Mal sehen was ich so finden kann
 
Zurück