Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: botschi am 04.09.07 - 15:54:32

Titel: Fehler bei Swing-Gui
Beitrag von: botschi am 04.09.07 - 15:54:32
Hallo,

ich habe folgendes Problem bei der Verwendung von notes.jar mit einer Java-Anwendung:
Wenn ich aus einer Konsolenanwendung heraus eine Session öffne funktioniert alles wunderbar.
Sobald es sich aber um eine Anwendung mit Swing-Gui handelt bekomme ich beim Öffnen der Session sofort einen Fehler.

Ich vermute das es vielleicht etwas mit den Threads zu tun hat in denen die Anwendung läuft.

Anbei die Fehlermeldung:

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x60007652, pid=1728, tid=232
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_03-b07 mixed mode)
# Problematic frame:
# C  [nnotes.dll+0x7652]
#

Stack: [0x0fe50000,0x0fe90000),  sp=0x0fe8e430,  free space=249k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [nnotes.dll+0x7652]
C  [nnotes.dll+0x188a43]
C  [nnotes.dll+0x188b6d]
C  [NLSCCSTR.DLL+0xf7b6]
C  [NLSCCSTR.DLL+0xf054]
C  [NLSCCSTR.DLL+0xf4b6]
C  [nlsxbe.dll+0x21d89]
C  [nlsxbe.dll+0x7d7d5]
C  [nlsxbe.dll+0x7f3ce]
C  [nlsxbe.dll+0x803d8]
C  [nlsxbe.dll+0x44bb0]
j  lotus.domino.local.Session.NgetDatabase(Ljava/lang/String;Ljava/lang/String;Z)I+0
j  lotus.domino.local.Session.getDatabase(Ljava/lang/String;Ljava/lang/String;)Llotus/domino/Database;+13

Matthias
Titel: Re: Fehler bei Swing-Gui
Beitrag von: flaite am 04.09.07 - 18:46:26
Das kann eigentlich nichts mit Swing oder Konsolen-Anwendung zu tun haben.
Startest du die Swing Anwendung von dem gleichen Rechner? 
Sieht so aus als ob da in der PATH Variable des Betriebssystems die falsche Notes Version vorne steht.
Wie sieht die PATH Variable in der Umgebung aus, in der du die Swing Anwendung startest?

Gruß Axel
Titel: Re: Fehler bei Swing-Gui
Beitrag von: botschi am 05.09.07 - 11:42:18
Funktioniert jetzt.
Die Klasse, die die Funktion ausführt, erbt von der Klasse "Notesthread" und damit gehts jetzt.

Danke für die Hilfe!

Matthias
Titel: Re: Fehler bei Swing-Gui
Beitrag von: Ralf_M_Petter am 05.09.07 - 14:44:24
Der Fehler liegt wahrscheinlich daran, dass du Swing Threading nicht verstanden hast.

Ohne Code ist es natürlich nur Kaffeesudleserei, aber ich denke, dass du zwar deinen Anwendungsthread für Notes initialisiert hast, nicht jedoch den Eventthread von Swing. Dies ist nicht ganz einfach, man sollte das aber unbedingt verstehen. Ebenso wie man Recycle verstehen sollte, da sonst die Programmierung von Notes Swing voll in die Hose geht.

Ausserdem sollte man meiner Meinung nach in der Notesprogrammierung Swing nicht mehr verwenden, da Notes selber in Richtung SWT geht. Wobei aber in SWT die selben Probleme mit dem Threading zu meisten sind wie in Swing.

Wenn du einen Beispielcode postest, sage ich dir wie du es machen musst.


Grüße

Ralf M Petter
Titel: Re: Fehler bei Swing-Gui
Beitrag von: botschi am 06.09.07 - 11:10:59
Hallo,

erstmal danke für die Antwort. Kannst Du mir mal ein Beispiel für die Threadinitialisierung unter Swing posten.

Ich benutze nur den Aufruf:
Code
NotesThread.sinitThread();

Muss ich noch etwas anderes machen ??


Matthias
Titel: Re: Fehler bei Swing-Gui
Beitrag von: flaite am 06.09.07 - 11:24:30
Ich glaub Ralf meint eher den Aufruf von Business-Logik (in deinem Fall was in Notes gemacht wird) aus einer Swing Gui ohne das letztere einfriert.
http://www.galileocomputing.de/openbook/javainsel6/javainsel_14_024.htm#mjb965381f58560b47f2662ee6638ea91c
 
Titel: Re: Fehler bei Swing-Gui
Beitrag von: botschi am 06.09.07 - 11:28:39
Hallo Axel,

dann habe ich das falsch verstanden.

@Ralf: Meintest Du das was Axel gepostet hat ?

Die Aktualisierung der GUI funktioniert einwandfrei.
Es kam halt bloss diese Fehlermeldung hoch, mit der ich nichts anfangen konnte.

Matthias



Titel: Re: Fehler bei Swing-Gui
Beitrag von: flaite am 06.09.07 - 11:51:40
Für wirklich ernsthafte Anwendungen wie Ralf sie mit Swing programmiert hat, könnte der Meinung sein, dass Aufrufe auf Lotus Notes aus einer Swing Gui ohne invokeAndWait oder invokeLater gar nicht "richtig" funktionieren können, obwohl es zufällig so aussieht als ob.
Wenn ich heute etwas neues lerne wie z.B. JSF, Groovy oder Grails, benutze ich immer gute vorhandene Beispielanwendungen. Gibts natürlich für Swing gegen Notes nicht wirklich. Zumindest sind mir keine bekannt.
Titel: Re: Fehler bei Swing-Gui
Beitrag von: Ralf_M_Petter am 06.09.07 - 12:12:57
Ich meine, dass du wie Axel schon geschrieben hat, jeden Thread, also sowohl den Eventthread als auch jeden anderen Thread für Notes wieder initialsieren musst, und auch wieder richtig terminieren musst. Gerade beim Event thread ist das aber ein wenig schwierig, da ja alle möglichen Events kommen können und auch mehrere Javaprogramme in einer JVM laufen können. Wenn ich es noch einmal machen würde, dann würde ich sämtlichen Notes Code in einem eigenen Thread laufen lassen, der dann wie Axel geschrieben hat, die Swing Gui mit InvokeLater aktualisiert. Zugriffe auf Swingobjekte von einem anderen Thread würde ich vermeiden wie der Teufel das Weihwasser.

Grüße

Ralf

P.S. Und nicht vergessen, Swing ist nicht gut unter Eclipse. Gibt zwar Integrationswerkzeuge aber die sind Murks. Also spätestens mit Notes 8 sollte man sowieso SWT verwenden, wo bei dann aber wirklich geile Sachen möglich sind. Auch wenn Swing SWT meiner Meinung nach in den meisten Punkten überlegen ist.
Titel: Re: Fehler bei Swing-Gui
Beitrag von: flaite am 07.09.07 - 10:53:37
Es ist ein bischen dappisch sich als Anfänger mit Swing zu beschäftigen.
Es liegt nahe, weil irgendwie will man ja mit seiner Anwendung kommunizieren und dann nimmt man eben Swing.
BUT: Swing ist kompliziert (innere Klassen,  Event Handler,  die man anmelden muss,  komplizierteres Threading-Zeugs als mit Webandungen, komplizierte Klassen, kompliziertes Zusammenspiel der Klassen und und und. 
So entstehen urban legends wie "in Java muss man alles selber machen".

Weniger frustrierend ist imho ein anderes Vorgehen: 
Einfach eine kleine und zielgerichtete API wie z.B. jexel (für Excel Zugriffe) nehmen und sich dann in die Junit-Tests Unterstützung für Eclipse ein bischen einlesen. Nicht mit Testdriven Development anfangen. Einfach für jede Funktion, die man proggen will, EINEN Junit Test schreiben. Z.B.: Alle Reihen einer Excel-Datei in eine ArrayList von selbstgeschriebenen Objekten schreiben. Das Programm startet man dann in Eclipse aus der Junit-Test Klasse und gibt das Ergebnis per System.out.println raus.  Eclipse besitzt für Junit-Testklasse einen Wizzard. Einfach bis zum letzten Screen durchklicken und als Test nur eine Methode anklicken (die wo die ganze gewünschte Funktionalität erledigt).  Das ist imho auch viel realistischer für Notes Entwickler,  da die Einbindungsmöglichkeiten für Java in Release 6 deutlich gestiegen sind.